时间:2021-05-28
前言
想象一下,您的应用需要一些动态配置信息,这些信息在应用启动之前需要动态获取,并在应用运行中使用。
显然不能直接写道静态配置文件中,但是从客户端发出的请求又是一个异步请求,如何协调这个问题呢?
这里,我想向您演示,如何在 Angular 应用初始化期间,使用 APP_INITIALIZER 注入器来获取应用的动态配置信息。
什么是 APP_INITIALIZER 注入器
APP_INITIALIZER 是允许您在 Angular 初始化七千处理您自己任务的机制。它既可以用于 AppModule,核心模块,也可以用于您自己的应用加载模块中。典型的场景是应用加载之前做的事情,比如从服务处加载用于设置应用的配置信息。在示例中,我们使用它从服务器的 XML 配置文件中加载应用的设置信息。
创建 AppLoad 模块
尽管不是必要,通过创建 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 Load Service
AppLoadService 应当隔离您在应用初始化期间的作为。当然这不是必须的,您可以使用任何需要的服务。
这里实现了两个方法我们在前面代码中使用的方法。在我们的 AppLoadModule 中作为依赖注入到提供器数组中。
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 中查看如下输出
注意:
如何从 settings 中获取 API 的地址?
有些人想:“如果没有 settings 来知道 URL, 我如何调用 API 呢?”,这是一个问题,您可以通过一个相对 URL 来通过 HttpClient ,并假设 API 在您的 Web 站点上。
参考资料
https:///Blog/angular-4-tutorial-run-code-during-app-initialization/
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、绑定初始化,自动加载通过绑定来进行angular的初始化,会把js代码侵入到html中。ng-app是angular的一个指令,代表一个angular应用(
在考虑类初始化时,我们都知道进行子类初始化时,如果父类没有初始化要先初始化子类。然而事情并没有一句话这么简单。首先看看Java中初始化触发的条件:(1)在使用n
一、在页面初始化时候将集合绑定到DropDownList复制代码代码如下:publicvoidPage_Load(Objectsrc.EventArgse){A
数组数组(Array):相同类型数据的集合。Java数组初始化的两种方法:静态初始化:程序员在初始化数组时为数组每个元素赋值;动态初始化:数组初始化时,程序员只
方法一(推荐):设置datetimepicker的属性ShowCheckBox为true在窗口初始化时候,添加代码this.datetimepicker1.Ch