Angular 响应式表单校验

Posted Angular完全开发手册

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular 响应式表单校验相关的知识,希望对你有一定的参考价值。

上篇文章讲了如何自定义模板表单校验,今天说的动态表单的验证更加简单。

 
   
   
 
  1. <input

  2.  [formControl]="name">

  3. <div *ngIf="name.invalid && (name.dirty||name.touched)">

  4.  <div *ngIf="name.errors.required">

  5.    name is required

  6.  </div>

  7.  <div *ngIf="name.errors.minlength">

  8.    minlength is 4

  9.  </div>

  10.  <div *ngIf="name.errors.noEmpty">

  11.    name can not be empty string

  12.  </div>

  13. </div>

  14. <div>{{name.errors | json}}</div>

模板很简洁,只需要给 input 添加一个 [formControl]="name" 。这个 name 并不是固定的,你可以自己取名,但要和组件类里的属性名相同。

 
   
   
 
  1. export class DyUserInputComponent implements OnInit {

  2.  name: FormControl;

  3.  constructor() {

  4.  }

  5.  ngOnInit(): void {

  6.    this.name = new FormControl(

  7.      'hello', // 初始值

  8.      [Validators.required, Validators.minLength(4)], // 同步校验器

  9.      [] // 异步校验器

  10.    );

  11.  }

  12. }

这样就完成了。因为 formControl 在 ReactiveFormsModule 中,所以需要在模块中引入 ReactiveFormsModule。

同样的,当在 input 中输入四个空格时,发现校验居然通过了。很明显我们需要自定义一个校验规则,保证输入不能为空格。这非常简单。你只需要定义一个函数:

 
   
   
 
  1. function noEmpty(c: AbstractControl) {

  2.  const value = c.value;

  3.  return value && value.trim() !== '' ? null : {'noEmpty': true};

  4. }

这个函数定义要遵循一定的规则:

一。函数接收一个类型为 AbstractContrl 的参数。

二。通过参数的 value 属性即可以拿到需要校验的输入。

三。自定义判断逻辑。但要保证在校验通过时返回null,不通过时返回一个对象。

四。如果返回了对象,对象的 key 应和校验器名称对应,value 可以为任意值,只要你觉得方便使用就行。

现在我们把它加入到 input 的校验规则中:

 
   
   
 
  1. ...

  2. ngOnInit(): void {

  3.    this.name = new FormControl(

  4.      'hello', // 初始值

  5.      [Validators.required, Validators.minLength(4),noEmpty], // 同步校验器

  6.      [] // 异步校验器

  7.    );

  8. }

  9. ...

现在输入四个空格:

 
   
   
 
  1. { "noEmpty": true }

可以发现,比模板表单的自定义校验要简单的多,不需要写 Directive,不需要定义 Providers。如果有问题,欢迎进群讨论。


以上是关于Angular 响应式表单校验的主要内容,如果未能解决你的问题,请参考以下文章

响应式表单-Angular高级编程

在 Angular 4 响应式表单中提交时显示验证消息

Angular2 动态生成响应式表单

在 Angular 7 中处理大型响应式表单

Angular 11 自定义 ISBN 验证器响应式表单

在 Angular 2 中,响应式表单不使用 ngModel 和 formArrayName 更新值