Angular2:无法解决全球服务问题

时间:2016-06-22 00:08:47

标签: typescript angular webpack

我扩展了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]
}

1 个答案:

答案 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),此处的顺序很重要。

Plunker example