【问题标题】:What is multi provider in angular2什么是angular2中的多提供者
【发布时间】:2016-11-03 19:41:17
【问题描述】:

我知道提供者是为了从另一个类获取服务,但什么是多提供者和令牌?

当我们做multi=true 的时候?

provide(NG_VALIDATORS, { useExisting: class),    multi: true })

【问题讨论】:

    标签: angular angular2-directives angular2-services angular2-forms


    【解决方案1】:

    multi: true 表示一个提供者令牌提供一组元素。例如,路由器支持routerLinkrouter-outlet 的所有指令均由ROUTER_DIRECTIVES 提供。
    如果使用令牌ROUTER_DIRECTIVES 注册了一个新的提供者,那么它将覆盖之前注册的指令。如果设置了multi: true(在第一个注册的新提供者上),则新指令将添加到先前注册的指令中,而不是覆盖。

    ROUTER_DIRECTIVES 被注入 (constructor(@Inject(ROUTER_DIRECTIVES) directives) {}) 时,会注入一组指令实例。注入ROUTER_DIRECTIVES 通常没有意义。我只是作为示例使用它,因为它是multi: true

    【讨论】:

    • 你能举个例子说明什么时候有用吗
    • 参见stackoverflow.com/questions/39033835/… 中的示例,其中可以在APP_INITIALIZERS 下提供多个工厂函数,Angular 将调用它们中的每一个(按照它们提供的顺序)并等待返回的Promise
    • NG_VALIDATORS 为例。他们是:required, min, max, email...
    • 这可能是 multi: true providers: [{ provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } ] 的相关示例
    【解决方案2】:

    使用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})
    ]);
    

    Details

    【讨论】:

    • 在DI中为单个token提供多个值是什么意思
    • 查看示例代码。在代码中注入一组指令/值。详细链接有示例和解释
    • 函数声明如下是什么意思:private get isReverse()什么是get关键字
    • 您将服务注册到令牌服务提供者(例如:NG_VALIDATORS)以获取事件。 Observer 使用令牌服务获取所有注册服务传递事件给它们(例如:Form 将从 NG_VALIDATORS 获取所有服务,然后将事件传递给所有验证)
    【解决方案3】:

    什么是多提供者?

    这里定义了提供者。

    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 以避免第一个提供程序不被注入。注入后,可以在类的构造函数中使用。

    注意:我不是这方面的专家。因此,如果您发现任何问题,请告诉我。

    【讨论】:

      【解决方案4】:

      来自文档:

      创建多个匹配相同令牌的提供者(多提供者)。 多提供者用于创建可插拔服务,其中 系统自带一些默认提供者,用户可以注册 额外的供应商。默认提供程序和 额外的提供者将用于驱动系统的行为。

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-11
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 2012-05-04
        相关资源
        最近更新 更多