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 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
javascript椭圆旋转相册实现代码
Jan 16 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
自己封装的一个原生JS拖动方法(推荐)
Nov 22 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 Javascript
jQuery实现简单QQ聊天框
Aug 27 jQuery
JavaScript 与 TypeScript之间的联系
Nov 27 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
提取HTML标签
2006/10/09 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
JS实现留言板功能
2017/06/17 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python 中split 和 strip的实例详解
2017/07/12 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
一份Java笔试题
2012/02/21 面试题
纪检干部先进事迹材料
2014/08/23 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
怎样写离婚协议书
2015/01/26 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
股东大会通知
2015/04/24 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL