什么是angular2中的多提供者

bla*_*awk 25 angular2-forms angular2-directives angular2-services angular

我知道提供者是从另一个类获得服务但是什么是多提供者和令牌的东西?

还有什么时候multi=true呢?

provide(NG_VALIDATORS, { useExisting: class),    multi: true })
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 29

multi: true表示一个提供者令牌提供一个元素数组.例如,对于路由器支持所有指令routerLink,router-outlet通过设置ROUTER_DIRECTIVES.
如果使用令牌注册了新的提供程序ROUTER_DIRECTIVES,则它将覆盖先前注册的指令.如果multi: true(在第一个注册的新的提供者上)设置,则新指令将添加到先前注册的指令而不是覆盖.

ROUTER_DIRECTIVESinject(constructor(@Inject(ROUTER_DIRECTIVES) directives) {})注入时,会注入一组指令实例.注射通常没有意义ROUTER_DIRECTIVES.我用它作为一个例子,因为它是multi: true.

  • `NG_VALIDATORS`作为例子.它们是:`required,min,max,email ...` (3认同)
  • 这可以是 **multi: true** `providers: [{ Provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } ]` 的相关示例 (3认同)
  • 请参阅/sf/ask/2732368481/#39033958中的示例,其中可以在`APP_INITIALIZERS`下提供多个工厂函数,Angular将调用他们每个人(按照他们提供的顺序)并等待返回的"承诺". (2认同)

Arp*_*wal 5

使用multi: true告诉Angular提供程序是多提供程序。如前所述,对于多个提供程序,我们可以为DI中的单个令牌提供多个值。

用途:

如果我们有几个指令可以自动在整个应用程序中使用,而无需任何人在组件修饰中定义它们,那么我们可以通过利用多个提供程序并扩展要注入的内容来做到这一点PLATFORM_DIRECTIVES

@Directive(...)
class Draggable { }

@Directive(...)
class Morphable { }

@Component(...)
class RootCmp { }
Run Code Online (Sandbox Code Playgroud)

// at bootstrap
bootstrap(RooCmp, [
  provide(PLATFORM_DIRECTIVES, {useValue: Draggable, multi: true}),
  provide(PLATFORM_DIRECTIVES, {useValue: Morphable, multi: true})
]);
Run Code Online (Sandbox Code Playgroud)

细节

  • 这意味着在DI中为单个令牌提供多个值 (2认同)

Don*_*nga 5

什么是多供应商?

提供者在此处定义。

https://angular.io/api/core/Provider

基本上,提供程序描述了如何配置注入器。因此,多提供商是您使用多个提供商而不是单个提供商,例如

providers: [
 { provide: TOKEN1 , useClass: ClassName1},

 { provide: TOKEN2 , useClass: ClassName2}
]
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,为给定的令牌创建了两个类的实例。然后这可用于依赖注入(在特定类的构造函数中。)


什么是令牌?

Token 是定位依赖值的查找键,例如让我们采取如下...

那么查找键是className的TYPE,依赖值是它的类的INSTANCE。

providers: [ClassName]
Run Code Online (Sandbox Code Playgroud)

在下面的例子中,TOKEN1 和 TOKEN2 是查找键,依赖值是两个类的实例。

providers: [
 { provide: TOKEN1 , useClass: ClassName1},

 { provide: TOKEN2 , useClass: ClassName2}
]
Run Code Online (Sandbox Code Playgroud)

我们什么时候使用 multi=true ?

当您为同一个令牌注册多个提供者时,multi 很有用。假设在下面的例子中,最后一个 provider 被注入,因为它是在最后使用的,意思是

您将无法使用 ClassName1 实例。所以你可以做的是使用 multi=true,这表明 Angular 为 SAME 令牌注册多个提供者。所以这会注入一组值。

它的价值是什么?该值是类的实例。

providers: [
 { provide: TOKEN , useClass: ClassName1},

 { provide: TOKEN , useClass: ClassName2}
]
Run Code Online (Sandbox Code Playgroud)

所以经验法则是,如果你为同一个 TOKEN 注册多个提供者,那么总是使用 multi=true 以避免第一个提供者不被注入。当它被注入时,你可以在类的构造函数中使用它。

注意:我不是这方面的专家。所以如果你看到任何问题,请告诉我。