深入理解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实现下拉菜单效果的代码
Jul 25 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
JavaScript中的null和undefined解析
Apr 14 Javascript
Javascript查询DBpedia小应用实例学习
Mar 07 Javascript
jQuery实现Twitter的自动文字补齐特效
Nov 28 Javascript
sails框架的学习指南
Dec 22 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
Jul 22 Javascript
Node.js中路径处理模块path详解
Nov 14 Javascript
vue.js路由跳转详解
Aug 28 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 Javascript
vue-router 源码实现前端路由的两种方式
Jul 02 Javascript
微信小程序如何获取手机验证码
Nov 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
php SQL之where语句生成器
2009/03/24 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
JS验证不重复验证码
2017/02/10 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
Python实现SMTP发送邮件详细教程
2021/03/02 Python
用matplotlib画等高线图详解
2017/12/14 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
python反扒机制的5种解决方法
2021/02/06 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
幼儿教育感言
2014/02/05 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
房产代理公证处委托书
2014/04/04 职场文书
阅兵口号
2014/06/19 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
Flink 侧流输出源码示例解析
2022/09/23 Servers