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实现检测浏览器及版本的脚本代码
Jan 22 Javascript
javascript转换日期字符串为Date日期对象的方法
Feb 13 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
js获取上传文件的绝对路径实现方法
Aug 02 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
小程序实现日历左右滑动效果
Oct 21 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 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计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
利用javascript中的call实现继承
2007/01/22 Javascript
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
基于jquery的表格排序
2010/09/11 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
Python实现简单的2048小游戏
2021/03/01 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
生物技术专业求职信
2014/06/10 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
自我检讨报告
2015/01/28 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL