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 相关文章推荐
toString()一个会自动调用的方法
Feb 08 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
javascript 实现动态侧边栏实例详解
Nov 11 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
小程序图片长按识别功能的实现方法
Aug 30 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP的5个安全措施小结
2012/07/17 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
js时间转换毫秒的实例代码
2019/08/21 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
js实现无缝轮播图
2020/03/09 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python制作最美应用的爬虫
2015/10/28 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
python中hashlib模块用法示例
2017/10/30 Python
Python实现感知机(PLA)算法
2017/12/20 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
详解Python的三种拷贝方式
2020/02/11 Python
python简单实现9宫格图片实例
2020/09/03 Python
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
公益广告语集锦
2014/03/13 职场文书
销售工作决心书
2015/02/04 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
正则表达式基础与常用验证表达式
2022/06/16 Javascript