学习目录

前言
本文属于Angular 4 依赖注入学习系列的第四篇,主要介绍了Angular 4 依赖注入之FactoryProvider的使用,感兴趣的朋友们下面来看看详细的介绍:
本系列教程的开发环境及开发语言:
基础知识
FactoryProvider 的作用
FactoryProvider 用于告诉 Injector (注入器),通过调用 useFactory 对应的函数,返回 Token 对应的依赖对象。
FactoryProvider 的使用
function serviceFactory() {
return new Service();
}
const provider: FactoryProvider = {
provide: 'someToken', useFactory: serviceFactory, deps: []
};
FactoryProvider 接口
export interface FactoryProvider {
// 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、
// OpaqueToken的实例或字符串
provide: any;
// 设置用于创建对象的工厂函数
useFactory: Function;
// 依赖对象列表
deps?: any[];
// 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖
// 对象列表
multi?: boolean;
}
FactoryProvider
介绍完基础知识,接下来我们马上进入正题。不知道大家是否还记得,之前我们创建过的 HeroComponent 组件:
import { Component, OnInit } from '@angular/core';
import { HeroService } from '../hero.service';
@Component({
selector: 'app-hero',
template: `
<ul>
<li *ngFor="let hero of heros">
ID: {{hero.id}} - Name: {{hero.name}}
</li>
</ul>
`
})
export class HeroComponent implements OnInit {
constructor(private heroService: HeroService) { }
heros: Array<{ id: number; name: string }>;
ngOnInit() {
this.heros = this.heroService.getHeros();
}
}
那么现在问题来了,假设我们想在获取英雄数据时,输出调试信息,那应该怎么办?What ~,这个问题不是很简单么,直接使用 console.log API 输出相应信息不就行了么:
console.log('Fetching heros...');
this.heros = this.heroService.getHeros();
那问题又来了,如果多个组件都使用 HeroService 去获取英雄数据,那么是不是每个组件都得添加对应的语句。另外如果要修改输出的调试信息,那就得修改程序中多个地方。其实我们一般只需要在开发阶段,输出调试信息,因此上面的方案不合理,也不够灵活。
其实我们可以借鉴之前引入 HeroService 服务的思路,创建一个 LoggerService 来解决上面提到的问题。
创建 LoggerService 服务
export class LoggerService {
constructor(private enable: boolean) { }
log(message: string) {
if(this.enable) {
console.log(`LoggerService: ${message}`);
}
}
}
配置 LoggerService 服务
@NgModule({
...
providers: [
HeroService,
LoggerService
],
bootstrap: [AppComponent]
})
export class AppModule { }
使用 LoggerService 服务
import { Component, OnInit } from '@angular/core';
import { HeroService } from '../hero.service';
import { LoggerService } from './../logger.service';
@Component({
selector: 'app-hero',
template: `
<ul>
<li *ngFor="let hero of heros">
ID: {{hero.id}} - Name: {{hero.name}}
</li>
</ul>
`
})
export class HeroComponent implements OnInit {
heros: Array<{ id: number; name: string }>;
constructor(private heroService: HeroService,
private loggerService: LoggerService) { }
ngOnInit() {
this.loggerService.log('Fetching heros...');
this.heros = this.heroService.getHeros();
}
}
以上代码运行后会抛出以下异常信息:
Uncaught Error: Can't resolve all parameters for LoggerService: (?).
有的读者,眼睛一亮,可能是你在创建 LoggerService 服务时,忘记使用 @Injectable 装饰器了。哈哈,其实我是故意的,但我加上 @Injectable() 后,还是抛出了以下异常:
ERROR Error: No provider for Boolean!
为什么会出现上面的异常信息呢?我们再看一下前面创建的 LoggerService 服务:
export class LoggerService {
constructor(private enable: boolean) { }
// ...
}
在 Angular 中我们通过构造注入的方式注入依赖对象, private enable: boolean 这种方式表示我们要注入 Type 类型的对象。然后 boolean 是表示基本数据类型,并不是所需的 Type 类型:
export function isType(v: any): v is Type<any> {
return typeof v === 'function';
}
接下来我们再来看一下最早抛出的异常:
Uncaught Error: Can't resolve all parameters for LoggerService: (?).
其实问题的答应也在 LoggerService 类的构造函数中,在创建 LoggerService 对象时,我们需要设置 enable 参数的值。那么如何解决呢? 当然可以使用我们的主角 - FactoryProvider 。
具体如下:
使用 FactoryProvider
@NgModule({
...,
providers: [
HeroService,
{
provide: LoggerService,
useFactory: () => {
return new LoggerService(true);
}
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
当更新完代码,然后再来一个华丽的保存操作,最后打开你的控制台,你将看到预期的输出信息:
LoggerService: Fetching heros...
难道就这样结束了,关于 FactoryProvider 的相关内容先告一段落,下一篇我们将介绍如何使用 FactoryProvider 配置依赖对象。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# angular4
# 依赖注入
# angularjs依赖注入
# angular依赖注入
# Angular 4依赖注入学习教程之InjectToken的使用(八)
# Angular 4依赖注入学习教程之ValueProvider的使用(七)
# Angular 4依赖注入学习教程之Injectable装饰器(六)
# Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
# Angular 4依赖注入学习教程之ClassProvider的使用(三)
# Angular 4依赖注入学习教程之组件服务注入(二)
# Angular 4依赖注入学习教程之简介(一)
# 深入理解Angular4中的依赖注入
# 抛出
# 多个
# 再来
# 我是
# 来了
# 相关内容
# 也在
# 你在
# 只需
# 但我
# 这个问题
# 所需
# 要在
# 感兴趣
# 我们可以
# 朋友们
# 很简单
# 来看看
# 就得
# 可以使用
相关文章:
济南网站建设制作公司,室内设计网站一般都有哪些功能?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
平台云上自助建站如何快速打造专业网站?
如何在阿里云香港服务器快速搭建网站?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星图片链接生成指南:自助建站与智能设计教程
如何在云主机快速搭建网站站点?
济南网站制作的价格,历城一职专官方网站?
建站之星如何助力网站排名飙升?揭秘高效技巧
建站之星安装模板失败:服务器环境不兼容?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
西安专业网站制作公司有哪些,陕西省建行官方网站?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何快速查询网址的建站时间与历史轨迹?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何快速配置高效服务器建站软件?
如何设置并定期更换建站之星安全管理员密码?
如何选择适合PHP云建站的开源框架?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何通过WDCP绑定主域名及创建子域名站点?
北京网站制作网页,网站升级改版需要多久?
如何零成本快速生成个人自助网站?
微信小程序 input输入框控件详解及实例(多种示例)
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何选择高效稳定的ISP建站解决方案?
制作证书网站有哪些,全国城建培训中心证书查询官网?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何在Windows虚拟主机上快速搭建网站?
建站之星伪静态规则如何设置?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
建站之星2.7模板快速切换与批量管理功能操作指南
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
免费视频制作网站,更新又快又好的免费电影网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
建站之星安装步骤有哪些常见问题?
重庆市网站制作公司,重庆招聘网站哪个好?
如何用好域名打造高点击率的自主建站?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星后台管理:高效配置与模板优化提升用户体验
如何在IIS7中新建站点?详细步骤解析
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
如何在Tomcat中配置并部署网站项目?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
网站设计制作企业有哪些,抖音官网主页怎么设置?
南京网站制作费用,南京远驱官方网站?
Swift中swift中的switch 语句
*请认真填写需求信息,我们会在24小时内与您取得联系。