我扩展了XHRBackend
类,我希望注入我的全局服务,并提供bootstraping。我试图通过构造函数
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
课程中很好地注入:
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]
}
答案 0 :(得分:0)
@Inject(AppState)
,则 AppState
是多余的
我得到了AppState的实例,但那是新实例, let injector = ReflectiveInjector.resolveAndCreate([AppState]);
这是预料之中的。您创建了一个与Angular应用程序使用的注入器完全无关的新注入器,因此您可以获得不同的实例。
你可以做什么(没有必要,对你当前的问题不可取)是注入Injector
并致电injector.get(AppState)
来获取实例。
很难从代码片段中分辨出实际问题是什么。可能存在一些循环依赖。
在您提供的Plunker(https://plnkr.co/edit/XVk9SaZgAJnJ1DRsUfWm?p=preview)中,http
捆绑包丢失,在您的代码中,您需要先提供HTTP_PROVIDERS
覆盖HTTP_PROVIDERS
中包含的提供程序的提供程序 - 在重写提供程序时(例如XHRBackend
),此处的顺序很重要。