在 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}
        );
     }
}