深入理解Angular4中的依赖注入


Posted in Javascript onJune 07, 2017

在Angular中使用依赖注入,可以帮助我们实现松耦合,可以说只有在组件中使用依赖注入才能真正的实现可重用的组件。
如果我们有个服务product.service.ts,其中export了一个ProductService类,类中有一个getProduct方法。

如果不使用依赖注入,假设我们需要在product组件中使用这个服务时就会new一个ProductService类,但如果这个组件被用到了另一个地方,需要的服务改变了,我们就不得不更改组件中的内容,这样的组件不能说是可复用的。

一、注入器

Angular中的注入器只有一种实现方法就是在构造函数中声明。

例如在一个组件中

constructor(productService: ProductService){}

通俗的讲这段代码的意思就是说,这个组件创建了一个productService,而这个productService是依赖ProductService的,这里的ProductService只是一个token,至于ProductService 是什么,是怎么实现的,全都是由提供器说明的。

二、提供器

通常提供器定义在应用级,及app.module.ts中,供所有组件或服务使用,当然也可以定义在某一个组件中,只供这一个组件使用。

我们以定义在应用级为例:

@NgModule({
  provides:[ProductService]
})

这段代码其实这一个简写,全写为:

@NgModule({
  provides:[{
    provide: ProductService,
    useClass:ProductService
  }]
})

这段代码中的provide声明的就是我们刚刚在注入器中提过的token,就是说这两个token是一一对应的,Angular会到提供器中找到和注入器相同的token.

代码中的useClass是实例化ProductService类,及我们帮助我们new 了一个类出来。除了useClass外,比较常用的还用useFactory,使用工厂模式实例化一个类。

这时候我们在组件中就可以直接使用ProductService类中的方法了。

当token和想要实例化的类名字相同时,我们就可以使用上面那种简写的方法。

说了这么多,那到底怎么才能体现出可复用性呢?

如果现在我们的product组件用到了另一个地方需要使用另一个服务,我们命名为AnotherProductService。有了依赖注入我们就不必要更改组件,而是更改app.module.ts中的提供器:

@NgModule({
  provide: ProductService,
  useClass: AnotherProductService
})

从这段代码可以看出,token并没有改变,可是这是实例化的类变为了AnotherProductService。

总结来说,当组件在构造函数中说明自己想要依赖一个类时,Angular首先会在这个组件自身找有没有提供器,如果没有就去这个组件的父组件中找,如果也没有找到就去应用级(app.module.ts)中找。找到后,就会按照提供器可说明的为组件注入它想要的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
JS实现闪动的title消息提醒效果
Jun 20 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
Oct 19 Javascript
Postman模拟发送带token的请求方法
Mar 31 Javascript
实现一个 Vue 吸顶锚点组件方法
Jul 10 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 Javascript
Vue中保存用户登录状态实例代码
Jun 07 #Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 #jQuery
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 #jQuery
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 #Javascript
Angular 4 指令快速入门教程
Jun 07 #Javascript
jstree单选功能的实现方法
Jun 07 #Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 #jQuery
You might like
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
教师节活动主持词
2014/04/02 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
会计试用期自我评价
2014/09/19 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript