【问题标题】:Understanding static methods inside the Validation class in angular4了解angular4中Validation类中的静态方法
【发布时间】:2019-03-12 08:55:55
【问题描述】:

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

组件.ts

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

现在当我转到验证器类的定义时,我发现了这个

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

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

【问题讨论】:

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


    【解决方案1】:

    required 方法返回一个带有“required”属性的错误映射:如果control: AbstractControl 的值为空,则{'required':true} 为空,否则为null

    .

    来自 Angular 源代码: 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 函数本身。

    【讨论】:

    • 我的问题是,为什么我们可以像这样使用 'contact':['',Validators.required] ?我们不应该像这样使用它 'contact':['',Validators.required('')]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2018-12-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2011-01-17
    • 2012-06-24
    相关资源
    最近更新 更多