深入理解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 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
javascript中动态加载js文件多种解决办法总结
Nov 15 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
Sep 09 Javascript
javascript常用函数(1)
Nov 04 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
Nov 29 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
彻底解决 webpack 打包文件体积过大问题
Jul 07 Javascript
vue页面使用阿里oss上传功能的实例(一)
Aug 09 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
javascript高仿热血传奇游戏实现代码
Feb 22 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
检测png图片是否完整的php代码
2010/09/06 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
layui文件上传实现代码
2017/05/20 Javascript
js中的闭包学习心得
2018/02/06 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
Python实现购物程序思路及代码
2017/07/24 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
如何利用find命令查找文件
2016/11/18 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
财务部出纳岗位职责
2013/12/22 职场文书
护士检查书
2014/01/17 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
个人自我鉴定总结
2014/03/25 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
经费申请报告范文
2015/05/18 职场文书
党小组考察意见
2015/06/02 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
python中的3种定义类方法
2021/11/27 Python
Python学习之迭代器详解
2022/04/01 Python