2

我有一项提供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它是无用的,因为它没有及时将值分配给静态变量。当它们在其他地方使用时,它们已经“未定义”。

有没有办法做到这一点?

4

1 回答 1

2

为了处理这种情况,要在应用程序启动之前初始化配置设置可用,您可以使用APP_INITALIZERprovider. APP_INITALIZERcollect 可以接受承诺,它会在应用程序初始化之前解决这些承诺。在您的情况下,它将确保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}
        );
     }
}
于 2018-03-07T05:08:14.957 回答