深入理解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 相关文章推荐
AeroWindow 基于JQuery的弹出窗口插件
Jun 27 Javascript
基于jquery的放大镜效果
May 30 Javascript
js保留两位小数使用toFixed实现
Jul 29 Javascript
JavaScript验证图片类型(扩展名)的函数分享
May 05 Javascript
json格式的javascript对象用法分析
Jul 04 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
javascript实现数字配对游戏的实例讲解
Dec 14 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
vue中移动端调取本地的复制的文本方式
Jul 18 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
php+mysql 实现身份验证代码
2010/03/24 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
XENON基于JSON变种
2010/07/27 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
关于python多重赋值的小问题
2019/04/17 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
在django模板中实现超链接配置
2019/08/21 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
市场部规章制度
2014/01/24 职场文书
入党自我鉴定
2014/03/25 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书