艾阳教育网
您的当前位置:首页理解Angular中APP_INITIALIZER的作用

理解Angular中APP_INITIALIZER的作用

来源:艾阳教育网
 有时候,你可能需要在应用程序初始化的时候加载些简单的数据或做简单的验证。大部分的什做法是在 main component 组件中做这个事情,但这很得难保证在其他的组件中有效使用,有没有更新的办法做这个事情 呢,请继续往下看。

在 Angular 中 APP_INITIALIZER 的作用是什么?

在官方文档是这样描述的:APP_INITIALIZER 是一个函数,在应用程序初始化时被调用。这就意味着可以通过 AppModule 类的 providers 以 factory 的形式配置它来使用,同时应用程序将会等待它加载完成后进行下一步,所以在这此只适合加载简单的数据。

示例

创建新项目

ng new example --skip-install
npm install # yarn install

配置 Provider

首先创建一个 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() 函数会在应用程序初始时立即调用

  • 创建Provider 工厂

    export function jokesProviderFactory(provider: JokesProvider){
     return () => provider.load();
    }

    注册 JokesProvider 和 APP_INITIALIZER

    @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()');
    }
    }

    显示全文