深入理解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中append、insertBefore、after与insertAfter的简单用法与注意事项
Apr 04 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
jquery设置控件位置的方法
Aug 21 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
Aug 09 Javascript
layer弹出层取消遮罩的方法
Sep 25 Javascript
js实现秒表计时器
Dec 16 Javascript
Jquery $.map使用方法实例详解
Sep 01 jQuery
vue 中使用print.js导出pdf操作
Nov 13 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
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
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
CI框架表单验证实例详解
2016/11/21 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
探究Python中isalnum()方法的使用
2015/05/18 Python
Python生成数字图片代码分享
2017/10/31 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Python如何进行时间处理
2020/08/06 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
材料专业毕业生求职信
2014/02/26 职场文书
5s标语大全
2014/06/23 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
大学生学期个人总结
2015/02/12 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript