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

所属分类: 网络编程 / JavaScript 阅读数: 1426
收藏 0 赞 0 分享

学习目录

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

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

基础知识

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能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

jQuery 行级解析读取XML文件(附源码)

项目中应用jQuery解析读取XML语言配置文件来实现语言的调度。这是jQuery解析读取XML文件功能的测试源码,现拿出来分享。
收藏 0 赞 0 分享

JS 文件本身编码转换 图文教程

JS编码转换,这句话本身就是一句具有二重义的话。通常理解为JS文件里能转换编码的代码,但是,我所碰到的问题并不是这样的,是要解决JS文件本身的编码问题,它是UTF-8编码的还是ANSI编码的?
收藏 0 赞 0 分享

jQuery Ajax之$.get()方法和$.post()方法

load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现Ajax的全部价值。在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或者是后面要讲解到的$.ajax方法)。
收藏 0 赞 0 分享

jQuery Ajax之load()方法

jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第2层是laod()、$.get()和$.post()方法,第3层是$.getScript()和$.getJSON()方法。
收藏 0 赞 0 分享

JavaScript 核心参考教程 内置对象

JavaScript 是根据 "ECMAScript"标准制定的网页脚本语言。这个标准由 ECMA 组织发展和维护。ECMA-262 是正式的 JavaScript 标准。
收藏 0 赞 0 分享

JavaScript 核心参考教程 RegExp对象

JavaScript 核心参考教程RegExp对象,学习正则表达式的朋友可以参考下。
收藏 0 赞 0 分享

javascript hashtable实现代码

javascript中没有像c#,java那样的哈希表(hashtable), 然而,javascript中的Array也只有一些类似于'哈希表'的非常简单功能。
收藏 0 赞 0 分享

百度留言本js 大家可以参考下

百度留言本js 大家可以参考下。
收藏 0 赞 0 分享

javascript 判断某年某月有多少天的实现代码 推荐

以前写网页的时候,经常碰到选择日期的问题,其实就是判断某年某月有多少天。
收藏 0 赞 0 分享

让iframe子窗体取父窗体地址栏参数(querystring)

突然用到,记录一下,对地址栏字符串用正则处理最好,有时间研究一下。 主要是思路。
收藏 0 赞 0 分享
查看更多