Angular如何在应用初始化时运行代码详解


Posted in Javascript onJune 11, 2018

前言

想象一下,您的应用需要一些动态配置信息,这些信息在应用启动之前需要动态获取,并在应用运行中使用。

显然不能直接写道静态配置文件中,但是从客户端发出的请求又是一个异步请求,如何协调这个问题呢?

这里,我想向您演示,如何在 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_INITIALIZER 导入自 @angular/core
  • 这里有多个 APP_INITIALIZER,它们在应用初始化过程中并发执行,直到它们全部完成。

    使用 nulti: true 用于多个注入器,如果只有一个,使用 multi: false。

  • 工厂函数 init_app 和 get_settings 应当返回一个返回 Promise 的函数。
  • 该模块必须添加到 AppModule 的导入数组中。

创建 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;
 }
}

注意以下几点:

  • initializeApp 用于等待 3 秒,并输出日志来显示两个方法是并行执行的。
  • getSettings 调用一个模拟的我使用 APIARY 创建的 API 来或者设置。

    这里使用这些设置来设置 APP_SETTINGS 对象的

  • 它们都返回 Promise

运行应用

运行应用,可以在 Console 中查看如下输出

Angular如何在应用初始化时运行代码详解

注意:

  • 您可以看到两个方法都被调用了。
  • 设置首先返回
  • initializeApp 最后完成,然后应用启动。

如何从 settings 中获取 API 的地址?

有些人想:“如果没有 settings 来知道 URL, 我如何调用 API 呢?”,这是一个问题,您可以通过一个相对 URL 来通过 HttpClient ,并假设 API 在您的 Web 站点上。

参考资料

https://www.intertech.com/Blog/angular-4-tutorial-run-code-during-app-initialization/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
克隆javascript对象的三个方法小结
Jan 12 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
Mar 28 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
浅谈页面装载js及性能分析方法
Dec 09 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
Feb 24 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
angular ng-repeat数组中的数组实例
Feb 18 Javascript
node.js中使用Export和Import的方法
Sep 18 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
Vue中实现回车键切换焦点的方法
Feb 19 Javascript
手把手教你实现 Promise的使用方法
Sep 02 Javascript
详解.vue文件解析的实现
Jun 11 #Javascript
vue filters的使用详解
Jun 11 #Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 #Javascript
jQuery实现的页面详情展开收起功能示例
Jun 11 #jQuery
Node.js中的cluster模块深入解读
Jun 11 #Javascript
详解vue-router 初始化时做了什么
Jun 11 #Javascript
node中间层实现文件上传功能
Jun 11 #Javascript
You might like
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
javascript String 对象
2008/04/25 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
layui table 参数设置方法
2018/08/14 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
大学生学期自我鉴定
2014/03/19 职场文书
小学生暑假家长评语
2014/04/17 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
小石潭记导游词
2015/02/03 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
毕业感言怎么写
2015/07/31 职场文书
小学数学新课改心得体会
2016/01/22 职场文书