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, ...
都执行push
到FOO
数组。
【讨论】:
以上是关于multi:true 在 angular4 中的提供者中意味着啥的主要内容,如果未能解决你的问题,请参考以下文章
Angular4 CLI 项目中的 Bootstrap 4 Datatablejs