在Angular2中,如何使用注入服务中的值来设置静态变量?

时间:2018-03-07 04:41:47

标签: angular angular-services static-variables injectable

我有一项提供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(){}
}

如果我将ConfigData添加到AnotherService中的构造函数中它没用,因为它没有及时将值赋给静态变量。它们在其他地方使用时已经“未定义”。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

为了处理此类情况,要在应用程序启动之前将配置设置初始化,您可以使用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}
        );
     }
}