1、前言
Multi providers是可以使用同一个Token去注册多个不同的Providers。
multi: true
表明这个provider是一个multi provider。当使用multi provider时,我们可以在DI中为单个Token令牌提供多个值。它们都有相同的Token,但它们能注册不同的provide。如果我们用Token去请求依赖项时,我们得到的是所有已注册的依赖对象列表。
const SOME_TOKEN: OpaqueToken = new OpaqueToken('SomeToken');
var injector = Injector.create([
{ provide: SOME_TOKEN, useValue: 'dependency one', multi: true },
{ provide: SOME_TOKEN, useValue: 'dependency two', multi: true }
]);
var dependencies = injector.get(SOME_TOKEN);
// dependencies == ['dependency one', 'dependency two']
如果使用同一个Token注册provider时,不加multi:true属性时,就会导致之后注册的provider会覆盖前面已经注册的provider,此外,multi provider这种机制提供了可插拔的钩子,且multi provider不能与普通的provider混合使用。
2、NG_VALIDATORS实现表单自定义检验器
定义一个validator
export interface ValidatorFn {
(c: AbstractControl): ValidationErrors | null;
}
当验证信息不通过的时候,会返回一个键值对,赋给formControl errors
export declare type ValidationErrors = {
[key: string]: any;
};
为指令指定供应商NG_VALIDATORS
import { Directive} from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl} from '@angular/forms';
@Directive({
selector: '[appConfirmpsw]',
providers: [{
provide : NG_VALIDATORS,
useExisting : ConfirmpswDirective,
multi: true
}]
})
export class ConfirmpswDirective implements Validator {
constructor() {
}
validate(control: AbstractControl): {[key: string]: any} {
//检验规则
}
}
这个Token用来去配置一些自定义的校验器Provider
3、APP_INITIALIZER
APP_INITIALIZER是一个函数,在应用改程序初始化时被调用。可以在AppModule类的providers中以factory的形式来配置。适合加载简单的数据或简单的校验。
export function loadFactory(loadService: LoadService): Function {
return () => loadService.load();
}
@NgModule({
providers: [
{
provide: APP_INITIALIZER,
useFactory: loadFactory,
deps: [LoadService, Injector],
multi: true
}
]
})
该Token用于配置系统的初始化相关工作。
网友评论