了解angular4的Validation类内部的静态方法

时间:2018-10-07 14:36:08

标签: angular-reactive-forms angular4-forms angular-validation angular-validator

我开始学习成角度的模型驱动形式,当我浏览模型驱动形式的文档时,我发现了

component.ts

 this.myForm= this.fb.group({
      'contact':['',Validators.required]
    }); 

现在,当我进入验证器类的定义时,我发现了这一点

export declare class Validators {
...
static required(control: AbstractControl): ValidationErrors | null;
...
}

解释了在验证器类中需要的是静态方法,它需要AbstractControl作为参数。但是为什么我可以在不传递任何参数的情况下使用它。

1 个答案:

答案 0 :(得分:1)

必需的方法返回一个具有'required'属性的错误映射:如果{'required':true}的值为空,则为control: AbstractControl,如果不是,则为null

从角度源代码中: https://github.com/angular/angular/blob/6.1.9/packages/forms/src/validators.ts#L133-L154

static required(control: AbstractControl): ValidationErrors|null {
    return isEmptyInputValue(control.value) ? {'required': true} : null;
  }

无需括号和参数就可以传递Validators.required的原因是因为Typescript是Javascript的超集,可以将函数存储为变量:

var Foo = function (control: AbstractControl)
{
  return anyVal;
};

与:

Foo(control: AbstractControl): any
{
  return anyVal;
};

所以这样做完全有效

var Bar = Foo;

并且由于函数只是保存可执行代码的变量,因此我们可以将函数存储在多个变量中或将其作为参数传递,这是在FormControl中完成的。

所以基本上,当你这样做

const control = new FormControl('', Validators.required);

您没有执行所需的方法,因为仅当添加括号和参数时才执行该方法。相反,您要传递Validator函数本身。