multi:true 在 angular4 中的提供者中意味着啥

Posted

技术标签:

【中文标题】multi:true 在 angular4 中的提供者中意味着啥【英文标题】:What does multi:true mean in providers in angular4multi:true 在 angular4 中的提供者中意味着什么 【发布时间】:2018-05-24 16:17:42 【问题描述】:

我在 angular4 中使用 HTTP_INTERCEPTORS。为此,我创建了实现HttpInterceptor 接口的HttpServiceInterceptor 类并提供intercept 方法的定义。然后像这样为HTTP_INTERCEPTORS注册提供者

providers: [
    provide: HTTP_INTERCEPTORS,
    useClass: HttpServiceInterceptor,
    multi: true
],

这工作正常。但我还是不明白multi:true 在这里是什么意思?我读过this answer。

如果我删除 multi:true 选项,那么浏览器端会出现错误

Uncaught Error: Provider parse errors:
Mixing multi and non multi provider is not possible for token InjectionToken_HTTP_INTERCEPTORS ("[ERROR ->]"): in NgModule AppModule in ./AppModule@-1:-1
    at NgModuleProviderAnalyzer.webpackJsonp.487.NgModuleProviderAnalyzer.parse (vendor.js:36335)
    at NgModuleCompiler.webpackJsonp.487.NgModuleCompiler.compile (vendor.js:43184)
    at JitCompiler.webpackJsonp.487.JitCompiler._compileModule (vendor.js:51527)
    at vendor.js:51472
    at Object.then (vendor.js:26354)
    at JitCompiler.webpackJsonp.487.JitCompiler._compileModuleAndComponents (vendor.js:51470)
    at JitCompiler.webpackJsonp.487.JitCompiler.compileModuleAsync (vendor.js:51399)
    at PlatformRef_.webpackJsonp.0.PlatformRef_._bootstrapModuleWithZone (vendor.js:4746)
    at PlatformRef_.webpackJsonp.0.PlatformRef_.bootstrapModule (vendor.js:4732)
    at Object.<anonymous> (app.js:23366)

这是否意味着HTTP_INTERCEPTORS 是初始化多个指令或组件的多提供者?如果是这样,那么其他指令和组件是什么?

【问题讨论】:

Multi-provider 与指令或组件没有任何关系。引用的答案仅作为示例提及指令。 所以根据答案 HTTP_INTERCEPTOR 是一个提供多个指令的令牌,注册新的提供者会覆盖其他注册的提供者? 它为每个令牌提供多个值。同样,它与指令无关。 拦截器不是指令或组件。提供者提供服务的实例。当使用 multi 时,提供者允许将服务添加到为给定令牌注册的服务数组(此处为拦截器)。所以 HttpClient 会得到一个拦截器数组,它们会被链式调用。 【参考方案1】:

多提供者与指令无关。 This answer 仅作为示例提及指令。

考虑到FOO是注入令牌,这个

providers: [
   provide: FOO, useClass: Bar, multi: true ,
   provide: FOO, useClass: Baz, multi: true 
]

使FOO 注入依赖成为分配给此令牌的多个提供者的数组,即与以下内容相同:

providers: [
   provide: FOO, useValue: [Bar, Baz] 
]

不同之处在于,可以在同一个注入器上的多个位置定义多个提供程序,并且所有额外的 provide: FOO, multi: true, ... 都执行pushFOO 数组。

【讨论】:

以上是关于multi:true 在 angular4 中的提供者中意味着啥的主要内容,如果未能解决你的问题,请参考以下文章

Angular4 中的自定义验证

Angular4 CLI 项目中的 Bootstrap 4 Datatablejs

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象

IE11中的Angular4应用程序运行问题

Angular4更改子组件中的导航栏值

Angular4 添加 WMS (openlayers)