全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

学习目录

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


# angular4  # 依赖注入  # angular依赖注入  # angularjs依赖注入  # Angular 4依赖注入学习教程之InjectToken的使用(八)  # Angular 4依赖注入学习教程之ValueProvider的使用(七)  # Angular 4依赖注入学习教程之Injectable装饰器(六)  # Angular 4 依赖注入学习教程之FactoryProvider的使用(四)  # Angular 4依赖注入学习教程之ClassProvider的使用(三)  # Angular 4依赖注入学习教程之组件服务注入(二)  # Angular 4依赖注入学习教程之简介(一)  # 深入理解Angular4中的依赖注入  # 一大  # 我们可以  # 这篇文章  # 先来  # 都是  # 就会  # 温故而知新  # 相关内容  # 你会  # 我有  # 是用来  # 适用于  # 俗话说得好  # 给大家  # 再来  # 来看看  # 你又  # 之二  # 谢谢大家  # 我们应该 


相关文章: 西安大型网站制作公司,西安招聘网站最好的是哪个?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  Android使用GridView实现日历的简单功能  建站之星如何助力网站排名飙升?揭秘高效技巧  PHP 500报错的快速解决方法  建站之星2.7模板快速切换与批量管理功能操作指南  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  股票网站制作软件,网上股票怎么开户?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  小程序网站制作需要准备什么资料,如何制作小程序?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  建站之星如何实现五合一智能建站与营销推广?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  在线教育网站制作平台,山西立德教育官网?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  建站之星导航配置指南:自助建站与SEO优化全解析  制作证书网站有哪些,全国城建培训中心证书查询官网?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  浅析上传头像示例及其注意事项  定制建站哪家更专业可靠?推荐榜单揭晓  广州营销型建站服务商推荐:技术优势与SEO优化解析  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何访问已购建站主机并解决登录问题?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何选择高效便捷的WAP商城建站系统?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在腾讯云服务器上快速搭建个人网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  如何做静态网页,sublimetext3.0制作静态网页?  如何用景安虚拟主机手机版绑定域名建站?  如何通过虚拟主机空间快速建站?  建站主机无法访问?如何排查域名与服务器问题  如何快速完成中国万网建站详细流程?  如何快速生成可下载的建站源码工具?  C++中引用和指针有什么区别?(代码说明)  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  清除minerd进程的简单方法  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在景安服务器上快速搭建个人网站?  Swift中switch语句区间和元组模式匹配  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。