main component 组件中做这个事情,但这很得难保证在其他的组件中有效使用,有没有更新的办法做这个事情 呢,请继续往下看。在官方文档是这样描述的:APP_INITIALIZER 是一个函数,在应用程序初始化时被调用。这就意味着可以通过 AppModule 类的 providers 以 factory 的形式配置它来使用,同时应用程序将会等待它加载完成后进行下一步,所以在这此只适合加载简单的数据。
ng new example --skip-install npm install # yarn install
首先创建一个 provider ,它会在请求解析完成后返回一个 Promise 对象
@Injectable()
export class JokesProvider {
private joke:JokeModel = null;
constructor(private http:Http){
}
public getJoke(): JokeModel {
return this.joke;
}
load() {
return new Promise((resolve,reject) => {
this.http.get(url)
.map(r=>r.json())
.subscribe(r=> {
this.joke = r['value'];
resolve(true);
})
})
}
}这里会经过三个过程:
getJoke() 方法在其他组件或模块调用时直接返回 joke 当前保存的数据
私有属性 joke 会保存当前请求的数据
load() 函数会在应用程序初始时立即调用
export function jokesProviderFactory(provider: JokesProvider){
return () => provider.load();
}@NgModule({
declarations:[
AppComponent
],
imports:[
BrowserModule,// required
HttpModule// required
],
providers: [
JokesProvider,
{
provide:APP_INITIALIZER,useFactory: jokesProviderFactory,
deps:[JoesProvider], multi:true
}
],
bootstrap:[AppComponent]
})
export class AppModule { }@Component({
selector:'app',
template:`<h1>Joke of the day: </h1><p>{{jokeModel.joke}} </p>`
})
export class AppComponent implements OnInit{
title = 'app';
jokeModel : JokeModel;
constructor(jokesProvider: JokesProvider){
this.jokeModel = jokesProvider.getJoke();
}
ngOnInit(){
console.log('AppComponent: OnInit()');
}
}