Angular2:无法解析全球服务
我扩展了XHRBackend
类,我想注入我的全局服务,提供自举。我试图通过构造器注入它Angular2:无法解析全球服务
export class AppXHRBackend extends XHRBackend {
constructor(
browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
@Inject(AppState) private app: AppState) {...}
...
}
但我得到undefined
。然后我试图通过注射器手动解决它:
export class AppXHRBackend extends XHRBackend {
constructor(browserXHR: BrowserXhr, baseResponseOptions: ResponseOptions) {
let injector = ReflectiveInjector.resolveAndCreate([AppState]);
let app = injector.get(AppState);
...
}
我的AppState
实例,但是,这是新的实例,我认为这是正确的,它应该是这样的,但我想我的单独服务。
这里是我bootsrap应用:
bootstrap(App, [
...
AppState,
provide(ExceptionHandler, {useClass: AppExceptionHandler}),
provide(XHRBackend, {useClass: AppXHRBackend})
])
这里是我的服务:
import { Injectable, EventEmitter } from '@angular/core';
@Injectable()
export class AppState {
...
}
顺便说一句,我的服务AppState
很好的AppExceptionHandler
类通过它的构造injectes:
export class AppExceptionHandler extends ExceptionHandler {
constructor(@Inject(AppState) private app: AppState) {...}
...
}
而且我没有看到非常大的差异这两个扩展,所以我不明白为什么它不起作用AppXHRBackend
一般来说,我只是希望我的全球服务,以处理全球401,403,404状态码。也许我会为了这个目的而错误的做法?
UPD 经由UseFactory
TY @yurzui通过提供解决:
{
provide: XHRBackend,
useFactory: (browserXHR: BrowserXhr,
baseResponseOptions: ResponseOptions,
xsrfStrategy: XSRFStrategy,
appState: AppState) => new AppXHRBackend(browserXHR, baseResponseOptions, xsrfStrategy, appState)
,
deps: [BrowserXhr, ResponseOptions, XSRFStrategy, AppState]
}
@Inject(AppState)
是多余的,如果参数的类型也是AppState
-
I got instance of AppState, but that was new instance, let injector = ReflectiveInjector.resolveAndCreate([AppState]);
这是预期的。您创建了与Angular应用程序使用的喷油器完全无关的新喷油器,因此您获得了不同的实例。
你可以做什么(这不是必要的,也不是建议你的当前问题)是注入Injector
并致电injector.get(AppState)
获取实例。
很难说出代码片段中的实际问题。可能有一些循环依赖。
从Plunker您提供(https://plnkr.co/edit/XVk9SaZgAJnJ1DRsUfWm?p=preview)那里
http
包丢失,并在你的代码,你需要提供HTTP_PROVIDERS
以前您提供了覆盖供应商包含在HTTP_PROVIDERS
- 为了事项这里覆盖供应商时(如XHRBackend
) 。
如果我得到你的权利我应该做的somethink这样的: '出口类AppXHRBackend扩展XHRBackend { 构造(browserXHR:BrowserXhr,baseResponseOptions:ResponseOptions,私人喷射:喷油器){ 超(browserXHR,baseResponseOptions); console.log(injector); } }' 但是我得到'undefined' –
是的,如果你的问题是由循环依赖引起的。 –
很难说出发生了什么事。你可以创建一个允许重现和调试的Plunker吗? (Plunker模板https://plnkr.co/edit/tpl:AvJOMERrnz94ekVua0u5) –
是否'AppState'有参数的构造函数? –