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 相关文章推荐
javascript中的变量是传值还是传址的?
Apr 19 Javascript
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
Javascript在IE和FireFox中的不同表现简析
Dec 03 Javascript
Jquery封装tab自动切换效果的具体实现
Jul 13 Javascript
jquery自动将form表单封装成json的具体实现
Mar 17 Javascript
javascript 事件处理示例分享
Dec 31 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
vue中的provide/inject的学习使用
May 09 Javascript
详解jQuery如何实现模糊搜索
May 10 jQuery
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
Element PageHeader页头的使用方法
Jul 26 Javascript
vue使用swiper实现左右滑动切换图片
Oct 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
基于mysql的bbs设计(一)
2006/10/09 PHP
mysql+php分页类(已测)
2008/03/31 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
js身份证验证超强脚本
2008/10/26 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
validator验证控件使用代码
2010/11/23 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python中bisect模块用法实例
2014/09/25 Python
详解Python中DOM方法的动态性
2015/04/11 Python
Python检测生僻字的实现方法
2016/10/23 Python
Python实现的快速排序算法详解
2017/08/01 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang