2016-11-27 121 views
7

我用Angular2 V2.2.3Angular2 - 異步依賴注入

我創建通用模塊forRoot()函數,就像這樣:

... 
    public static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: CommonsModule, 
     providers: [ 
      SomeOtherDependency, 
      { 
       provide: ConfigService, 
       useFactory: ConfigFactory, 
       deps: [Http] 
      }     
     ] 
    }; 

這裏是我的ConfigFactory:

export function ConfigFactory(http:Http):Promise<ConfigService> {  
    return http.get('confg/config.json').map(r => { 
     return new ConfigService(r); 
    }).toPromise(); 
} 

我試圖返回無極和可觀察爲好。

Provider中定義的SomeOtherDependency需要ConfigService。問題在於Angular沒有注入承諾解決的價值,而是承諾自己。

如何強制角度等待,直到承諾解決了適當的依賴關係,然後將其注入其他依賴關係?

我試過不同的方法,總是注入價值是承諾或可觀察。就像iniector忽略什麼類型的工廠返回。我需要在整個應用程序啓動前加載一些json文件

+0

的可能的複製[2個 - 服務消費等服務之前調用的方法(http://stackoverflow.com /問題/ 38127741 /角2的服務費時,其他服務前方的呼叫A-法) – estus

+0

退房也評論這個問題http://stackoverflow.com/questions/40522938/lazy-loading-module -with-APP-初始化?noredirect = 1個#comment68288686_40522938 – yurzui

+0

之前,我問我已經看到了這個話題。他們不適合我。 –

回答

3

我發現了一個問題。

當我需要返回函數時,我從工廠返回了一個承諾。另外我錯過了來自提供者部分的「多」參數。這裏被更新的工廠與APP_INITIALIZER工作:

export function ConfigFactory(config:ConfigService, http:Http):Function { 
    return() => config.load(http); 
} 

而在模塊:

providers: [ 
    ConfigService, 
    { 
     provide: APP_INITIALIZER, 
     useFactory: ConfigFactory, 
     deps: [ConfigService, Http], 
     multi: true 
    }, 
] 
+0

如何在另一個組件上使用此值?請使用plnkr.co – gtzinos

+0

發送示例像往常一樣使用它:構造函數(private configService:ConfigService){}。我會注入沒有問題。 –