所以我在查看角度核心文件,我对这四段代码的连接方式有点困惑?
export class InjectionToken extends OpaqueToken { private _differentiate_from_OpaqueToken_structurally: any; constructor(desc: string) { super(desc); } toString(): string { return `InjectionToken ${this._desc}`; } }
export const NG_VALIDATORS = new InjectionToken>('NgValidators');
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如何受益,根据定义,它本身就是一个常数
答案 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
重定向的令牌。