我知道提供程序是从另一个类获取服务但是什么是多提供程序和令牌的东西?
当我们做multi=true
时?
provide(NG_VALIDATORS, { useExisting: class), multi: true })
答案 0 :(得分:24)
multi: true
表示一个提供者令牌提供了一系列元素。例如,路由器支持的所有指令routerLink
,router-outlet
由ROUTER_DIRECTIVES
提供
如果使用令牌ROUTER_DIRECTIVES
注册了新提供程序,则它将覆盖先前注册的指令。如果设置了multi: true
(在第一个注册的和新提供者上),则新指令将添加到先前注册的指令中,而不是覆盖。
当注入ROUTER_DIRECTIVES
(constructor(@Inject(ROUTER_DIRECTIVES) directives) {}
)时,会注入一组指令实例。注入ROUTER_DIRECTIVES
通常没有意义。我只是将它用作示例,因为它是multi: true
。
答案 1 :(得分:5)
使用multi: true
告诉Angular提供者是多提供者。如前所述,对于多提供商,我们可以为DI中的单个令牌提供多个值。
<强>用途:强>
如果我们有一些指令应该在我们的整个应用程序中自动可用,而不必在组件装饰中定义它们,我们可以通过利用多个提供程序并扩展为{{1}注入的内容来实现这一点。 }。
PLATFORM_DIRECTIVES
和
@Directive(...)
class Draggable { }
@Directive(...)
class Morphable { }
@Component(...)
class RootCmp { }
答案 2 :(得分:1)
来自文档:
创建匹配相同令牌的多个提供程序(多提供程序)。 多供应商用于创建可插拔服务,其中 系统附带一些默认提供程序,用户可以注册 其他供应商。默认提供者和组合的组合 其他提供商将用于推动系统的行为。
答案 3 :(得分:0)
什么是多提供商?
提供商在这里定义。
https://angular.io/api/core/Provider
基本上,提供者描述了注射器的配置方式。因此,多提供商是您使用多个提供商而不是单个提供商
providers: [
{ provide: TOKEN1 , useClass: ClassName1},
{ provide: TOKEN2 , useClass: ClassName2}
]
在上述情况下,将为给定令牌创建两个类的实例。然后可以将其用于依赖项注入(在特定类的构造函数中)。
什么是令牌?
令牌是用于定位依赖项值的查找键,例如,让我们采取以下措施……
然后,查找键是className的TYPE,而依赖项值是其类的INSTANCE。
providers: [ClassName]
在下面的示例中,TOKEN1和TOKEN2是查找键,而依赖项值是两个类的实例。
providers: [
{ provide: TOKEN1 , useClass: ClassName1},
{ provide: TOKEN2 , useClass: ClassName2}
]
何时使用multi = true?
当您为同一令牌注册多个提供程序时,multi很有用。在下面的示例中,由于最后使用了提供者,因此最后一个提供者被注入,这意味着
您将无法使用ClassName1实例。因此,您可以做的是使用multi = true,这会向Angular发出信号,要求为SAME令牌注册多个提供程序。因此,这会注入值的数组。
值是多少?该值是类的实例。
providers: [
{ provide: TOKEN , useClass: ClassName1},
{ provide: TOKEN , useClass: ClassName2}
]
因此,经验法则是,如果您正在为同一个令牌注册多个提供程序,则始终使用multi = true以避免未注入第一个提供程序。注入后,可以在类的构造函数中使用它。
注意:我不是这方面的专家。因此,如果您发现任何问题,请告诉我。