想象一下,您的应用须要一些动态配置信息,这些信息在应用启动以前须要动态获取,并在应用运行中使用。api
显然不能直接写道静态配置文件中,可是从客户端发出的请求又是一个异步请求,如何协调这个问题呢?数组
这里,我想向您演示,如何在 Angular 应用初始化期间,使用 APP_INITIALIZER 注入器来获取应用的动态配置信息。promise
APP_INITIALIZER 是容许您在 Angular 初始化七千处理您本身任务的机制。它既能够用于 AppModule,核心模块,也能够用于您本身的应用加载模块中。典型的场景是应用加载以前作的事情,好比从服务处加载用于设置应用的配置信息。在示例中,咱们使用它从服务器的 XML 配置文件中加载应用的设置信息。服务器
尽管不是必要,经过建立 App Load module 仍是对应用加载有助于隔离。并发
import { NgModule, APP_INITIALIZER } from '@angular/core'; import { HttpClientModule } from "@angular/common/http"; import { AppLoadService } from './app-load.service'; export function init_app(appLoadService: AppLoadService) { return () => appLoadService.initializeApp(); } export function get_settings(appLoadService: AppLoadService) { return () => appLoadService.getSettings(); } @NgModule({ imports: [HttpClientModule], providers: [ AppLoadService, { provide: APP_INITIALIZER, useFactory: init_app, deps: [AppLoadService], multi: true }, { provide: APP_INITIALIZER, useFactory: get_settings, deps: [AppLoadService], multi: true } ] }) export class AppLoadModule { }
注意一下几点:app
AppLoadService 应当隔离您在应用初始化期间的做为。固然这不是必须的,您可使用任何须要的服务。异步
这里实现了两个方法咱们在前面代码中使用的方法。在咱们的 AppLoadModule 中做为依赖注入到提供器数组中。ide
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import 'rxjs/add/operator/toPromise'; import { APP_SETTINGS } from '../settings'; @Injectable() export class AppLoadService { constructor(private httpClient: HttpClient) { } initializeApp(): Promise<any> { return new Promise((resolve, reject) => { console.log(`initializeApp:: inside promise`); setTimeout(() => { console.log(`initializeApp:: inside setTimeout`); // doing something resolve(); }, 3000); }); } getSettings(): Promise<any> { console.log(`getSettings:: before http.get call`); const promise = this.httpClient.get('http://private-1ad25-initializeng.apiary-mock.com/settings') .toPromise() .then(settings => { console.log(`Settings from API: `, settings); APP_SETTINGS.connectionString = settings[0].value; APP_SETTINGS.defaultImageUrl = settings[1].value; console.log(`APP_SETTINGS: `, APP_SETTINGS); return settings; }); return promise; } }
注意如下几点:函数
运行应用,能够在 Console 中查看以下输出this
注意:
如何从 settings 中获取 API 的地址?
有些人想:“若是没有 settings 来知道 URL, 我如何调用 API 呢?”,这是一个问题,您能够经过一个相对 URL 来经过 HttpClient ,并假设 API 在您的 Web 站点上。
https://www.intertech.com/Blog/angular-4-tutorial-run-code-during-app-initialization/