深入理解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 相关文章推荐
二叉树的非递归后序遍历算法实例详解
Feb 07 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
May 03 Javascript
使用JQuery实现智能表单验证功能
Mar 08 Javascript
Vue实现双向绑定的方法
Dec 22 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
详解如何使用webpack打包Vue工程
May 27 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
微信小程序实现全国机场索引列表
Jan 31 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
Aug 08 jQuery
vue-cli V3.0版本的使用详解
Oct 24 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 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
消息持续发送的完整例子
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
HTML上传控件取消选择
2013/03/06 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
智能电子应届生求职信
2013/11/10 职场文书
学前班教师的自我鉴定
2013/12/05 职场文书
学生自我鉴定
2013/12/18 职场文书
银行办理业务介绍信
2014/01/18 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
演讲比赛策划方案
2014/06/11 职场文书
2014年帮扶工作总结
2014/11/26 职场文书