2016-06-22 97 views
2

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

是否'AppState'有参数的构造函数? –

回答

0
  • @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) 。

Plunker example

+0

如果我得到你的权利我应该做的somethink这样的: '出口类AppXHRBackend扩展XHRBackend { 构造(browserXHR:BrowserXhr,baseResponseOptions:ResponseOptions,私人喷射:喷油器){ 超(browserXHR,baseResponseOptions); console.log(injector); } }' 但是我得到'undefined' –

+0

是的,如果你的问题是由循环依赖引起的。 –

+0

很难说出发生了什么事。你可以创建一个允许重现和调试的Plunker吗? (Plunker模板https://plnkr.co/edit/tpl:AvJOMERrnz94ekVua0u5) –