在 Angular2 中,如何使用注入服务中的值来设置静态变量?
In Angular2, how do I use a value from an injected service to set a static variable?
我有一项提供 config
数据的服务。
@Injectable()
export class ConfigData {
someObj: any;
constructor(private http: HttpClient) {
this.http.get('/config-data').subscribe((data) => {this.someObj = data})
}
}
现在我想使用该对象在另一个服务中设置一个静态变量。
@Injectable()
export class AnotherService {
public static A_STATIC_VAR = ConfigData.someObj.specific_value
constructor(){}
}
如果我在AnotherService
中的构造函数中添加ConfigData
它是没有用的,因为它没有及时赋值给静态变量。在其他地方使用时,它们已经 "undefined"。
有什么办法可以做到吗?
为了处理这种情况,要在应用程序启动之前初始化配置设置可用,您可以使用 APP_INITALIZER
提供程序。 APP_INITALIZER
collect 可以接受承诺,它会在应用程序初始化之前解决这些承诺。在您的情况下,它将确保 ConfigData
在您要使用它之前准备就绪,当应用程序启动时。
@NgModule({
imports: [HttpClientModule],
providers: [
ConfigData,
{
provide: APP_INITIALIZER,
useFactory: (configData: ConfigData) => {
return () => configData.getConfiguration().toPromise()
},
deps: [ConfigData],
multi: true
}
]
})
export class AppLoadModule { }
服务
@Injectable()
export class ConfigData {
someObj: any;
constructor(private http: HttpClient) {
}
//created method to return observable,
//so that we can use it in APP_INITIALIZER
getConfiguration(){
return this.http.get('/config-data').do(
(data) => {this.someObj = data}
);
}
}
我有一项提供 config
数据的服务。
@Injectable()
export class ConfigData {
someObj: any;
constructor(private http: HttpClient) {
this.http.get('/config-data').subscribe((data) => {this.someObj = data})
}
}
现在我想使用该对象在另一个服务中设置一个静态变量。
@Injectable()
export class AnotherService {
public static A_STATIC_VAR = ConfigData.someObj.specific_value
constructor(){}
}
如果我在AnotherService
中的构造函数中添加ConfigData
它是没有用的,因为它没有及时赋值给静态变量。在其他地方使用时,它们已经 "undefined"。
有什么办法可以做到吗?
为了处理这种情况,要在应用程序启动之前初始化配置设置可用,您可以使用 APP_INITALIZER
提供程序。 APP_INITALIZER
collect 可以接受承诺,它会在应用程序初始化之前解决这些承诺。在您的情况下,它将确保 ConfigData
在您要使用它之前准备就绪,当应用程序启动时。
@NgModule({
imports: [HttpClientModule],
providers: [
ConfigData,
{
provide: APP_INITIALIZER,
useFactory: (configData: ConfigData) => {
return () => configData.getConfiguration().toPromise()
},
deps: [ConfigData],
multi: true
}
]
})
export class AppLoadModule { }
服务
@Injectable()
export class ConfigData {
someObj: any;
constructor(private http: HttpClient) {
}
//created method to return observable,
//so that we can use it in APP_INITIALIZER
getConfiguration(){
return this.http.get('/config-data').do(
(data) => {this.someObj = data}
);
}
}