【发布时间】:2016-11-03 19:41:17
【问题描述】:
我知道提供者是为了从另一个类获取服务,但什么是多提供者和令牌?
当我们做multi=true 的时候?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
【问题讨论】:
标签: angular angular2-directives angular2-services angular2-forms
我知道提供者是为了从另一个类获取服务,但什么是多提供者和令牌?
当我们做multi=true 的时候?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
【问题讨论】:
标签: angular angular2-directives angular2-services angular2-forms
multi: true 表示一个提供者令牌提供一组元素。例如,路由器支持routerLink、router-outlet 的所有指令均由ROUTER_DIRECTIVES 提供。
如果使用令牌ROUTER_DIRECTIVES 注册了一个新的提供者,那么它将覆盖之前注册的指令。如果设置了multi: true(在第一个注册的和新提供者上),则新指令将添加到先前注册的指令中,而不是覆盖。
当ROUTER_DIRECTIVES 被注入 (constructor(@Inject(ROUTER_DIRECTIVES) directives) {}) 时,会注入一组指令实例。注入ROUTER_DIRECTIVES 通常没有意义。我只是作为示例使用它,因为它是multi: true。
【讨论】:
APP_INITIALIZERS 下提供多个工厂函数,Angular 将调用它们中的每一个(按照它们提供的顺序)并等待返回的Promise。
NG_VALIDATORS 为例。他们是:required, min, max, email...
providers: [{ provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } ] 的相关示例
使用multi: true 告诉 Angular 提供者是一个多提供者。如前所述,通过多个提供者,我们可以为 DI 中的单个令牌提供多个值。
用法:
如果我们有几个指令应该在我们的整个应用程序中自动可用,而无需任何人在组件装饰中定义它们,我们可以通过利用多个提供程序并扩展为PLATFORM_DIRECTIVES 注入的内容来做到这一点。
@Directive(...)
class Draggable { }
@Directive(...)
class Morphable { }
@Component(...)
class RootCmp { }
和
// at bootstrap
bootstrap(RooCmp, [
provide(PLATFORM_DIRECTIVES, {useValue: Draggable, multi: true}),
provide(PLATFORM_DIRECTIVES, {useValue: Morphable, multi: true})
]);
【讨论】:
什么是多提供者?
这里定义了提供者。
https://angular.io/api/core/Provider
基本上,提供程序描述了注入器的配置方式。因此,多提供者是指您使用多个提供者而不是单个提供者,例如
providers: [
{ provide: TOKEN1 , useClass: ClassName1},
{ provide: TOKEN2 , useClass: ClassName2}
]
在上述场景中,为给定的令牌创建了两个类的实例。然后可用于依赖注入(在特定类的构造函数中。)
什么是令牌?
token 是查找依赖值的查找键,比如下面这样……
那么查找键就是className的TYPE,依赖值就是其类的INSTANCE。
providers: [ClassName]
在下面的示例中,TOKEN1 和 TOKEN2 是查找键,依赖值是两个类的实例。
providers: [
{ provide: TOKEN1 , useClass: ClassName1},
{ provide: TOKEN2 , useClass: ClassName2}
]
我们什么时候使用 multi=true ?
当您为同一个令牌注册多个提供者时,multi 很有用。比方说在下面的例子中,那么最后一个provider被注入,因为它在最后被使用,意思是
您将无法使用 ClassName1 实例。所以你可以做的是使用 multi=true,这表明 Angular 为 SAME 令牌注册多个提供者。所以这会注入一个 ARRAY 值。
价值是什么?该值是类的实例。
providers: [
{ provide: TOKEN , useClass: ClassName1},
{ provide: TOKEN , useClass: ClassName2}
]
因此,经验法则是,如果您为同一个 TOKEN 注册多个提供程序,则始终使用 multi=true 以避免第一个提供程序不被注入。注入后,可以在类的构造函数中使用。
注意:我不是这方面的专家。因此,如果您发现任何问题,请告诉我。
【讨论】:
来自文档:
创建多个匹配相同令牌的提供者(多提供者)。 多提供者用于创建可插拔服务,其中 系统自带一些默认提供者,用户可以注册 额外的供应商。默认提供程序和 额外的提供者将用于驱动系统的行为。
【讨论】: