2016-11-27 9 views
7

私はこのように、forRoot()関数で共通モジュールを作成したAngular2のV2.2.3Angular2 - 非同期依存性注入

を使用します。ここでは

... 
    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(); 
} 

私はプロミスとオブザーバブルを返そうとしました。

プロバイダで定義されているSomeOtherDependencyには、ConfigServiceが必要です。問題は、Angularが約束で解決された値を注入するのではなく、それを約束するということです。

私は、promiseが適切な依存関係で解決されてから他の依存関係に注入されるまで、angleを強制的に待機させることができますか?

私はさまざまなアプローチを試してきましたが、常に注入された値は約束しているか、または観察可能です。 iniectorは、返された型のファクトリを無視します。アプリケーション全体が起動する前にjsonファイルをロードする必要があります

+0

の可能性のある重複ここでAPP_INITIALIZERと連携し、工場更新されます/ questions/38127741/angular-2-services-consuming-others-services-before-call-a-method) – estus

+0

この質問へのコメントもチェックしてください。http://stackoverflow.com/questions/40522938/lazy-loading-module -with-app-initializer?noredirect = 1#comment68288686_40522938 – yurzui

+0

私は尋ねる前にこのトピックを見ました。彼らは私のために働かない。 –

答えて

3

問題が見つかりました。

代わりに関数を返す必要があるとき、私は工場から約束を返していました。また、私はプロバイダのセクションから "マルチ"引数を逃した。

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

、モジュール内:[ - 他のサービスを消費するサービスの前にメソッドを呼び出す2角度](http://stackoverflow.com

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

この値を別のコンポーネントで使用するにはどうすればよいですか? plnkr.co – gtzinos

+0

を使用して例を送信してください。常に:コンストラクタ(private configService:ConfigService){}のように使用してください。私は問題なく注射されます。 –