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学习笔记2 使用XMLHttpRequest对象的responseXML
Oct 16 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
关于onchange事件在IE和FF下的表现及解决方法
Mar 08 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
JavaScript实现in-place思想的快速排序方法
Aug 07 Javascript
微信小程序 数组中的push与concat的区别
Jan 05 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
JavaScript中最常用的10种代码简写技巧总结
Jun 28 Javascript
基于JS递归函数细化认识及实用实例(推荐)
Aug 07 Javascript
vue.js $refs和$emit 父子组件交互的方法
Dec 20 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
js实现内置计时器
Dec 16 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
深入extjs与php参数交互的详解
2013/06/25 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
python简单分割文件的方法
2015/07/30 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
django的ORM模型的实现原理
2019/03/04 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
老师自我鉴定范文
2013/12/25 职场文书
保护环境倡议书300字
2014/05/19 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
党员三严三实心得体会
2014/10/13 职场文书
教师个人发展总结
2015/02/11 职场文书
力克胡哲观后感
2015/06/10 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
Redis分布式锁Redlock的实现
2021/08/07 Redis
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL