视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Angular8基础应用之表单及其验证
2020-11-27 21:52:31 责编:小采
文档


一、前提

  • 必要性:特别必要
  • 意义:很有意义
  • 二、正文

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

    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个验证规则的,所以可以高度复用,而且维护起来也灵活一些

    总结

    下载本文
    显示全文
    专题