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学习网址备忘
May 29 Javascript
用js实现计算代码行数的简单方法附代码
Aug 13 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
可自己添加html的伪弹出框实现代码
Sep 08 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
Nov 09 Javascript
js实现股票实时刷新数据案例
May 14 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 Javascript
百度小程序自定义通用toast组件
Jul 17 Javascript
Vue自定义组件的四种方式示例详解
Feb 28 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 字符串函数收集
2010/03/29 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
微信小程序的生命周期的详解
2017/10/19 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Python3.x对JSON的一些操作示例
2017/09/01 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
What is view? why do we have view?
2012/06/22 面试题
MIS软件工程师的面试题
2016/04/22 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
实习医生自我评价
2013/09/22 职场文书
警示教育活动总结
2014/05/05 职场文书
文明市民先进事迹
2014/05/15 职场文书
社会学专业求职信
2014/07/17 职场文书
励志演讲稿500字
2014/08/21 职场文书
2014年节能工作总结
2014/12/18 职场文书
团组织推优材料
2014/12/29 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle