【问题标题】:Difference between NG_VALIDATORS and validators (Class)NG_VALIDATORS 和验证器(类)之间的区别
【发布时间】:2018-01-15 02:16:57
【问题描述】:

我对 NG_VALIDATORS 的用途感到困惑,我知道它是提供者令牌。但是它有什么用呢?它有什么不同的表单验证器类?

https://github.com/angular/angular/blob/4.3.3/packages/forms/src/validators.ts

【问题讨论】:

    标签: angular


    【解决方案1】:

    您有两种方法可以将验证器添加到表单控件。通过将它们指定为表单控件的参数来使用命令式方法:

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

    或通过在模板中使用验证器特定指令以声明方式:

    <input [formControl]='ctrl' required>
    

    NG_VALIDATORS 令牌用于第二种情况。这些令牌由验证器指令requiredemail 和其他人定义。它们是在由表单指令创建的注入器上定义的 - NgFormNgModelNgModelGroup。请参阅How exactly works the services hierarchy in this Angular 2 application? 以了解有关创建自己的注入器的指令的更多信息。

    所有内置和自定义验证器都使用此令牌注册:

    export const EMAIL_VALIDATOR: any = {
      provide: NG_VALIDATORS,
      useExisting: forwardRef(() => EmailValidator),
      multi: true
    };
    @Directive({
      selector: '[email]...',
      providers: [EMAIL_VALIDATOR]  <-------------
    })
    export class EmailValidator implements Validator {
    

    export const REQUIRED_VALIDATOR: Provider = {
      provide: NG_VALIDATORS,
      useExisting: forwardRef(() => RequiredValidator),
      multi: true
    };
    @Directive({
      selector:
          '[required]...',
      providers: [REQUIRED_VALIDATOR],  <-------------
    })
    export class RequiredValidator implements Validator {
    

    Angular 反应式和模板驱动的表单指令(NgFormNgModelNgModelGroup)使用此令牌注入验证器:

    export class NgForm extends ControlContainer implements Form {
      ...    
      constructor(
          @Optional() @Self() @Inject(NG_VALIDATORS) validators: any[],
    

    export class NgModel extends NgControl implements OnChanges,
      ...
      constructor(@Optional() @Self() @Inject(NG_VALIDATORS) validators...,
    

    export class NgModelGroup extends AbstractFormGroupDirective implements ... {
      ...
      constructor(
          @Optional() @Self() @Inject(NG_VALIDATORS) validators: any[],
    

    NG_ASYNC_VALIDATORS 令牌也是如此。

    【讨论】:

    • 感谢您的回复!这很有帮助,但我有疑问....对于反应式表单,我们为什么要导入验证器类。我知道它有那些验证器方法。如果 NG_VALIDATORS 已经注册了这些验证器,为什么会有两件事看起来在做同样的事情(不确定我是否正确)?
    • 您可以使用指令以声明方式添加验证器 - requiredemail 和其他指令,或者通过将它们导入并添加到 new FormControl() 来强制添加验证器。我会将此信息添加到答案中
    • 好的,所以我只看一下 NG_VALIDATORS 的背景,它是 InjectionToken 的一个实例,它基本上是一个类。因此,当我在(提供者的)提供中使用 NG_VALIDATORS(这是一个类)并使用“useExisting:forwardRef(()=> EmailValidator)”时,EmailValidator 又是一个类。现在的问题是,这两个类 NG_VALIDATORS 和 EmailValidators 如何在提供程序中相互链接或单独链接?
    • answered 在您的其他问题中。我的 this 答案还有什么不清楚的地方吗?
    猜你喜欢
    • 2023-03-29
    • 2018-04-20
    • 1970-01-01
    • 2014-05-09
    • 2021-08-23
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多