这些角度电子邮件指令代码片段如何连接

时间:2017-08-08 01:36:09

标签: angular

所以我在查看角度核心文件,我对这四段代码的连接方式有点困惑?

  1. 注入令牌代码,它是一个类
  2. 
        export class InjectionToken extends OpaqueToken {
              private _differentiate_from_OpaqueToken_structurally: any;
              constructor(desc: string) { super(desc); }
    
              toString(): string { return `InjectionToken ${this._desc}`; }
        }
    
    
    1. 使用注入令牌的NG_VALIDATORS代码
    2. 
          export const NG_VALIDATORS = new InjectionToken>('NgValidators');
      
      
      1. 使用NG_VALIDATORS所需的验证器
      2. 
            export const REQUIRED_VALIDATOR: Provider = {   
                provide: NG_VALIDATORS,   
                useExisting: forwardRef(() => RequiredValidator),   
                multi: true 
            };
        
        
        
            @Directive({
                ...
            }) export class RequiredValidator implements Validator {
                //Code here
            }
        
        

        我遇到问题,将REQUIRED_VALIDATOR声明中的代码追溯到注入令牌。我了解大多数基本元素,但不确定"使用现有"正在用于RequiredValidator类(我理解forwardRef)。以及NG_VALIDATORS如何受益,根据定义,它本身就是一个常数

1 个答案:

答案 0 :(得分:2)

在Angular DI系统中,令牌可以是在运行时中可用的任何引用,包括类的实例。所以这里有一个类InjectionToken的实例:

export const NG_VALIDATORS = new InjectionToken>('NgValidators');

由变量NG_VALIDATORS引用。

Angular DI系统引入了一种策略,可以将请求从一个令牌重定向到另一个令牌。这是这里使用的策略:

export const REQUIRED_VALIDATOR: Provider = {   
    provide: NG_VALIDATORS,   
    useExisting: forwardRef(() => RequiredValidator),   
    multi: true 
};

但它重定向到什么?它重定向到类RequiredValidator引用的令牌。要了解RequiredValidator的来源,您需要知道Angular将指令类实例添加到元素注入器。所以如果你有两个指令:

@Directive({selector:'adir'...}) export class ADirective {}
@Directive({selector:'bdir'...}) export class BDirective {}

并像这样应用它们:

<input adir bdir>

在这些元素上创建的注入器将包含以下提供者:

[
  { token: ADirective, instance: new ADirective() },
  { token: BDirective, instance: new BDirective() }
]

因此,添加到此元素的任何指令都可以通过类标记注入这些实例。

对于required验证程序,当您将指令required应用于元素时:

<input required>

在注入器中,RequiredValidator的实例由令牌RequiredValidator创建,这正是NG_VALIDATORS重定向的令牌。