私はAngular2 v2.2.3を使用します
私は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();
}
私はプロミスとオブザーバブルを返そうとしました。
プロバイダーで定義されているSomeOtherDependencyにはConfigServiceが必要です。問題は、Angularが約束で解決された値を注入するのではなく、それを約束するということです。
私はどのようにして、約束が適切な依存関係で解決され、それを他の依存関係に注入するまで待つように強制することができますか?
私はさまざまなアプローチを試してきましたが、常に注射された価値は有望か観察可能です。 iniectorは、返された型のファクトリを無視します。アプリケーション全体が起動する前にjsonファイルをロードする必要があります
私は問題を見つけました。
代わりに関数を返す必要があるとき、私は工場から約束を返していました。また、私はプロバイダのセクションから "マルチ"引数を逃した。ここに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
},
]