模板驱动验证

<input id="name" name="name" class="form-control" 
      required minlength="4" appForbiddenName="bob" <-- 自定义验证
      [(ngModel)]="hero.name" #name="ngModel" > <-- NgModel 把自己控制的 FormControl 实例的属性映射出去,让你能在模板中检查控件的状态

<div *ngIf="name.invalid && (name.dirty || name.touched)"
    class="alert alert-danger">

  <div *ngIf="name.errors.required">
    Name is required.
  </div>
  <div *ngIf="name.errors.minlength">
    Name must be at least 4 characters long.
  </div>
  <div *ngIf="name.errors.forbiddenName">
    Name cannot be Bob.
  </div>

</div>

响应式表单验证

【验证器函数】

  • 同步验证器函数接收一个控件实例,然后返回一组验证错误或null。你可以在实例化一个 FormControl时把它作为构造函数的第二个参数传进去

  • 异步验证器函数接收一个控件实例,并返回一个承诺promise 或可观察对象Observable , 它们稍后会发出一组验证错误或null。你可以在实例化一个FormControl时把它作为构造函数的第三个参数传进去

【内置验证器】

this.heroForm = new FormGroup({
    'name': new FormControl(this.hero.name, [
      Validators.required,
      Validators.minLength(4),
      forbiddenNameValidator(/bob/i) // <-- Here's how you pass in the custom validator.
    ]),
    'alterEgo': new FormControl(this.hero.alterEgo),
    'power': new FormControl(this.hero.power, Validators.required)
  });

自定义验证器

由于内置验证器无法适用于所有应用场景,有时候需要建立自定义验证器

export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    const forbidden = nameRe.test(control.value);
    return forbidden ? {'forbiddenName': {value: control.value}} : null;
  };
}

【添加响应式表单】

this.heroForm = new FormGroup({
  'name': new FormControl(this.hero.name, [
    Validators.required,
    Validators.minLength(4),
    forbiddenNameValidator(/bob/i) // <-- Here's how you pass in the custom validator.
  ]),
  'alterEgo': new FormControl(this.hero.alterEgo),
  'power': new FormControl(this.hero.power, Validators.required)
});

【添加到模板驱动表单】
建立一个指令来包装这个自定义验证器

@Directive({
  selector: '[appForbiddenName]',
  providers: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}]
})
export class ForbiddenValidatorDirective implements Validator {
  @Input('appForbiddenName') forbiddenName: string;

  validate(control: AbstractControl): {[key: string]: any} | null {
    return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, 'i'))(control) : null;
  }
}

表示控件状态的css类

通过以下类空值表单的css样式

  • ng-valid 验证通过
  • ng-invalid 验证不通过
  • ng-pending 在等待...期间
  • ng-pristine 原始状态
  • ng-dirty 被动过的
  • ng-untouched 没有被触碰的
  • ng-touched 被触碰之后的
Copyright © frankshi.com 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-06-04 07:52:42

results matching ""

    No results matching ""