Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)


Posted in Javascript onJune 04, 2017

学习目录

  • Angular 4 依赖注入教程之一 依赖注入简介
  • Angular 4 依赖注入教程之二 组件服务注入
  • Angular 4 依赖注入教程之三 ClassProvider的使用
  • Angular 4 依赖注入教程之四 FactoryProvider的使用
  • Angular 4 依赖注入教程之五 FactoryProvider配置依赖对象
  • Angular 4 依赖注入教程之六 Injectable 装饰器
  • Angular 4 依赖注入教程之七 ValueProvider的使用
  • Angular 4 依赖注入教程之八 InjectToken的使用

本文主要给大家介绍了关于Angular 4依赖注入之FactoryProvider配置依赖对象的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:

本系列教程的开发环境及开发语言:

  • Angular 4 +
  • Angular CLI
  • TypeScript

基础知识

Console 对象

Console 对象可以在任何全局对象中访问,如 Window,WorkerGlobalScope 以及通过属性工作台提供的特殊定义。在浏览器中我们可以通过 Window.console 访问 console 对象,使用示例如下:

console.log('My nickname is semlinker');

FactoryProvider 的作用

FactoryProvider 用于告诉 Injector (注入器),通过调用 useFactory 对应的函数,返回 Token 对应的依赖对象。

FactoryProvider 接口

export interface FactoryProvider {
 // 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、
 // OpaqueToken的实例或字符串
 provide: any;
 // 设置用于创建对象的工厂函数
 useFactory: Function;
 // 依赖对象列表
 deps?: any[];
 // 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖
 // 对象列表
 multi?: boolean;
}

在 FactoryProvider的使用 这篇文章中,我们已经介绍了 FactoryProvider 的一些相关知识。接下来我们将介绍如何使用 FactoryProvider 配置依赖对象。

FactoryProvider

俗话说得好,温故而知新。我们先来回顾一下上一节创建的 LoggerService 服务:

export class LoggerService {
 constructor(private enable: boolean) { }

 log(message: string) {
 if(this.enable) {
  console.log(`LoggerService: ${message}`);
 }
 }
}

LoggerService 的正确配置方式如下:

@NgModule({
 ...,
 providers: [
 HeroService,
 {
 provide: LoggerService, 
 useFactory: () => {
 return new LoggerService(true);
 }
 }
 ],
 bootstrap: [AppComponent]
})
export class AppModule { }

在继续介绍前,我们先来了解一下 Angular 的一大特色:

跨平台开发

学习如何基于 Angular 构建应用程序,并复用代码和技能来构建适用于所有平台的应用。比如:Web应用、移动Web应用、原生移动应用和原生桌面应用等。

没错,Angular 框架的一大特色就是跨平台开发。回到正题,不知道读者有没有察觉到,在 LoggerService 类中的 log() 方法内,我们是直接使用 console.log() 方法输出调试信息。虽然在大多数情况下,我们的应用都是运行在浏览器环境下,但 console.log() 存在兼容性问题 (了解详细信息 - Can I Use)。除此之外,假如日后我们的应用需要运行在其它平台下,就会出现问题。

为了解决上述问题,我们可以创建一个 ConsoleService 服务,且该服务需实现统一的 Console 接口。但本文的重点不在这里,因此我们先简单实现一个 ConsoleService 服务:

export class ConsoleService {
 log(message) {
 console.log(`ConsoleService: ${message}`);
 }
}

接下来我们就需要更新先前的 LoggerService 服务:

export class LoggerService {
 constructor(private enable: boolean,
 consoleService: ConsoleService) { }

 log(message: string) {
 if (this.enable) {
  console.log(`LoggerService: ${message}`);
 }
 }
}

但当我们更新完 LoggerService ,成功保存后,你会看到以下异常信息:

app.module.ts (27,16): Supplied parameters do not match any signature of call target.

这说明提供的参数与调用目标的签名不匹配,这是因为在 AppModule 中,LoggerService 的配置方式是:

{
 provide: LoggerService, 
 useFactory: () => {
 return new LoggerService(true);
}

而此时 LoggerService 构造函数输入参数的个数为两个,因此会抛出上面的异常。那么我们应该怎么解决这个问题呢?这时我们就要利用 FactoryProvider 接口中定义的 deps 属性,来声明 LoggerService 所依赖的对象。

配置 deps 属性

{
 provide: LoggerService, 
 useFactory: (consoleService) => {
 return new LoggerService(true, consoleService);
 },
 deps: [ConsoleService]
}

更新 AppModule

@NgModule({
 ...,
 providers: [
 HeroService,
 ConsoleService,
 {
 provide: LoggerService, 
 useFactory: (consoleService) => {
 return new LoggerService(true, consoleService);
 },
 deps: [ConsoleService]
 }
 ],
 bootstrap: [AppComponent]
})
export class AppModule { }

当更新完代码,然后再来一个华丽的保存操作,最后打开你的控制台,你又看到预期的输出信息:

LoggerService: Fetching heros...

我有话说

工厂函数是用来干嘛的?

在现实生活中,工厂是用来生产产品的,如鞋子工厂用来生产鞋子。而 FactoryProvider 接口中 useFactory 属性对应的工厂函数就是用来创建依赖对象。此外生产一双鞋子也需要对应的材料,如鞋底、鞋带等,而创建依赖对象也可能需要依赖其它对象,因此 FactoryProvider 接口中定义了 deps 属性用来声明依赖对象列表。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
jquery根据name属性查找的小例子
Nov 21 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
Mar 07 Javascript
JavaScript实现三级级联特效
Nov 05 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
Aug 22 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
vue.js多页面开发环境搭建过程
Apr 24 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
Aug 26 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
JavaScript基础之this详解
Jun 04 #Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
Jun 04 #Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
Jun 04 #Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 #Javascript
JavaScript箭头(arrow)函数详解
Jun 04 #Javascript
Angular 4依赖注入学习教程之简介(一)
Jun 04 #Javascript
angularJs中datatable实现代码
Jun 03 #Javascript
You might like
聊天室php&mysql(六)
2006/10/09 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python可变参数函数用法实例
2015/07/07 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
法人代表任命书范本
2014/06/05 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
社区国庆节活动总结
2015/03/23 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
故意伤害辩护词
2015/05/21 职场文书
晚会开场白和结束语
2015/05/29 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python