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时间验证和转换工具小例子
Jul 01 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
js实现图片点击左右轮播
Jul 08 Javascript
JS实现弹性漂浮效果的广告代码
Sep 02 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
js前端面试题及答案整理(一)
Aug 26 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
js时间戳和c#时间戳互转方法(推荐)
Feb 15 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
浅谈关于vue中scss公用的解决方案
Dec 02 Javascript
使用vue实现通过变量动态拼接url
Jul 22 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
二招解决php乱码问题
2012/03/25 PHP
php基础教程
2015/08/26 PHP
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
请假条格式范文
2014/04/10 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
教师个人读书活动总结
2014/07/08 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
小学美术教学反思
2016/02/17 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
Tomcat用户管理的优化配置详解
2022/03/31 Servers