我有一个ConfigFactory
。它的工作是检索应用程序配置(外部json文件)并保存在ConfigService
中。
应用模块
providers: [
{
provide: APP_INITIALIZER,
useFactory: configurationFactory,
deps: [ConfigurationService],
multi: true
}
]
问题:另一个Angular Service需要在其自身的构造函数中的应用配置信息 。但是在此时间点(应用程序初始化阶段),配置信息为未定义。
现在,我尝试使用useValue = configs
创建一个InjectionToken,以便它可以在@Inject(TEST_DATA)
中成为ServiceB
。但是它似乎不起作用。
configurationFactory
export const TEST_DATA = new InjectionToken<any>('TestData');
export function configurationFactory(configService: ConfigService): () => Promise<any> {
return (): Promise<any> => {
return new Promise((resolve, reject) => {
http.get('externalPath').then((config) => {
// save Config in configService
return configService.saveConfig(config);
}).then((config) => {
// attempt save config. Example: config contains 'hello'
resolve({ provide: TEST_DATA, useValue: config });
}).catch(() => {
reject();
});
});
};
}
在ServiceB
构造函数中使用TEST_DATA
@Injectable()
export class ServiceB{
constructor(@Inject(TEST_DATA) public data: any) {
console.log('ServiceB', data);
// however this prints 'TEST_DATA'. Expected: 'hello'
}
如何允许另一个Service构造函数获取由APP_INITIALIZER/configurationFactory
解析的数据?
答案 0 :(得分:0)
有多种方法可以做到这一点。
最简单的方法是从ConfigurationService
中公开一个可观察对象,并在ServiceB
中使用它。尽管这需要ServiceB
才能将ConfigurationService
声明为依赖项。
现在,一旦加载了配置,您就可以始终通过可观察对象发出它。此外,您还可以更好地控制通过ConfigurationService