2016-06-22 47 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) –