Angular8基础应用之表单及其验证


Posted in Javascript onAugust 11, 2019

一、前提

  • 必要性:特别必要
  • 意义:很有意义

二、正文

(一)、新建表单(模板表单)

1、新建名称为formValidator的ng项目——命令行输入ng new formValidator;

2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;

"scripts": {
 "ng": "ng",
 "start": "ng serve --open --port 4210",//修改端口号&自动打开默认浏览器窗口
 "build": "ng build",
 "test": "ng test",
 "lint": "ng lint",
 "e2e": "ng e2e"
 },

3、新建组件,命令行输入ng g c templateForm --spec false;

4、将app.components.html中的内容,替换成<app-template-form></app-template-form>

5、在app.module.ts中引入FormModul并在import中使用;

6、书写formValidator组件

//template-form.html
 <div class="container">
  <form (ngSubmit)="save()" #myForm="ngForm">
  <input 
   type="text" 
   [(ngModel)]="name" //双向数据绑定
   name="name" //使用form时必须定义,可以理解为当前控件的名字
   #myName="ngModel" //检查当前控件状态的出口,应用:myName.valid、myName.errors等
   autocomplete="off" //关闭浏览器自带的显示历史记录 h5新属性
   [appVerifyName]="nameList" //添加验证器
  >
  <!--invalid是否验证成功-->
  <!--dirty是否改变-->
  <!--touched是否被抚摸过-->
  <div *ngIf="myName.invalid && (myName.dirty || myName.touched)">
   <div *ngIf="myName.errors.required">
    名称为必填项
   </div>
   <div *ngIf="myName.errors.repeat">
    名称重复
   </div> 
  </div>
  <button type="submit" [disabled]="!myForm.form.valid">提交</button> //验证通过才能提交 
  </form>
 </div>
//template-form.ts
  ...
  
  name: string;
  
  nameAry:string[] = ['zhangsan','lisi','wangwu'];
  
  constructor() { }

  ngOnInit() {}
  
  save(): void{
    console.log('save 发请求')
  }
  ...

(二)、验证表单

1、新建指令,用于验证ng g c d share/verifyName

2、在share目录下新建nameValidator.ts,用于书写验证函数

//share/nameValidator.ts
  
  import { ValidatorFn, AbstractControl } from "@angular/forms";

  export function nameValidator(nameList: string[]): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } | null => {
      //依据指令中传递进来的名称列表进行判断,如果包含,就返回一个对象,对象的key将
      //作为模板(template-form.html)中被验证的控件的erros的key,如果不包含返回null
      //表示验证通过
      return nameList.includes(control.value) ? { 'repeat': { value: control.value } } : null;
    };
  }

3、书写指令——验证名称不能重复

//verify-name.directive.ts
  
  import { Directive, Input } from '@angular/core';
  import { Validator, NG_VALIDATORS, AbstractControl } from '@angular/forms';
  import { nameValidator } from './nameValidator';
  
  @Directive({
   selector: '[appVerifyName]',
   providers: [{
    provide: NG_VALIDATORS,
    useExisting: VerifyNameDirective,
    multi: true
   }]
  })
  export class VerifyNameDirective implements Validator { //实现Validator接口
  
   @Input('appVerifyName') //接收验证规则(reg),或者你希望传到指令中的什么
   nameList: string[];
  
   validate(control: AbstractControl): { [key: string]: any } | null {
    return this.name ? nameValidator(nameList)(control) : null
   }
  }

三、碎碎念

如果只有一个表单或者项目比较小巧,用这样的验证机制,我认为是不太明智的(用ng都没必要),随便弄个计数器或者标识位就能达到dirty和touched的效果,反之,大概率上没有一个项目有一万个表单控件,定义9000个验证规则的,所以可以高度复用,而且维护起来也灵活一些

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
3种不同方式的焦点图轮播特效分享
Oct 30 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
jQuery.prop() 使用详解
Jul 19 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
jQuery中的siblings用法实例分析
Dec 24 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
May 16 Javascript
预防网页挂马的方法总结
Nov 03 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
JavaScript 九种跨域方式实现原理
Feb 11 Javascript
浅谈javascript错误处理
Aug 11 #Javascript
axios异步提交表单数据的几种方法
Aug 11 #Javascript
node.js实现带进度条的多文件上传
Mar 27 #Javascript
基于Express框架使用POST传递Form数据
Aug 10 #Javascript
Vue实现点击显示不同图片的效果
Aug 10 #Javascript
vue+eslint+vscode配置教程
Aug 09 #Javascript
一个手写的vue放大镜效果
Aug 09 #Javascript
You might like
php中截取字符串支持utf-8
2007/01/18 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
jquery实现穿梭框功能
2021/01/19 jQuery
python操作日期和时间的方法
2014/03/11 Python
浅谈Python基础之I/O模型
2017/05/11 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
python 字符串追加实例
2019/07/20 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
python 安装移动复制第三方库操作
2020/07/13 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
捐书倡议书
2014/08/29 职场文书
法人代表证明书格式
2014/10/01 职场文书
青年文明号申报材料
2014/12/23 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
Java界面编程实现界面跳转
2022/06/16 Java/Android