Angular2学习笔记(六) Angular2 依赖注入
2019独角兽企业重金招聘Python工程师标准>>>
在java的世界中我们有spring的DI
神器,而在angular的世界中我们同样有DI
,由于这里文章篇幅偏大,只捡主要的讲解,其他的信息可参考最后给出的链接
什么是装饰器,装饰器都有什么
装饰器 java里面叫注解,angular官方称其为装饰器.其最后会生成json文件的元数据文件.
装饰器类型
装饰器 | 作用 | 重要 |
---|---|---|
Component
|
标记类作为组件并收集组件配置元数据(继承Directive) | ***** |
Directive
|
标记类作为指令并收集组件配置元数据 | ***** |
Injectable
|
标记元数据并可以使用Injector 注入器注入
|
***** |
Inject
|
指定依赖关系的参数装饰器(一般用来注入被标记Injectable 的类)
|
** |
Optional
|
将依赖项标记为可选的参数元数据. 如果没有找到依赖关系,注射器将提供null | ** |
ContentChild
|
配置一个内容查询 | *** |
ViewChild
|
配置一个视图查询 | *** |
ViewChildren
|
配置多个视图查询(返回QueryList 类型)
|
*** |
ContentChildren
|
配置多个个内容查询(返回QueryList 类型)
|
*** |
Host
|
按照依赖关系来检索 | ** |
Self
|
指定注射器只能从本身检索依赖关系 | ** |
SkipSelf
|
指定注射器只能从父类检索依赖关系 | ** |
Type
|
调用ES7装饰 | * |
java的世界大家都叫他注解,其实就是带着@符号的类(暂时这么理解就好)
依赖注入的好处
有了依赖注入我们可以随时更改注入类,比如我们定义一个日志接口Logger,其实现类有Logger1,Logger2,Logger3....
,等一系列实现,假如我们要没有依赖注入,那么我们要创建n多次实例,有了依赖注入,只需要更改下就可以了.
useClass属性
useClasss,要注入的实际子类
providers:[{ provide: Logger, useClass: Logger1 }]
注意千万别使用接口注入,例如useClass放一个接口,那么angular会报错的,因为在JavaScript世界里面没有接口的概念
useExisting属性
useExisting,使用已经注册的类型注入到这里(即别名),下面示例意思是将Logger1起个叫Logger2的别名
providers:[{ provide: Logger2, useExisting: Logger1 }]
useValue属性
useValue,值或对象替换,如
{ provide: MyValue, useValue: 41 }
useFactory属性
useFactory,使用工厂注入
//采用的lambda表达式语法
let testServiceFactory = (logger: Logger) => {return new TestService(logger);
};providers:[{ provide: TestService , useFactory: testServiceFactory, deps: [Logger] }]
deps属性
deps属性是提供商令牌(其实就是一个类的标示)数组.
手动创建一个基于接口的注入类
解决方案是定义和使用 OpaqueToken(不透明的令牌)。定义方式类似于这样:
import { OpaqueToken } from '@angular/core';
export let APP_CONFIG = new OpaqueToken('app.config');
使用这个OpaqueToken对象注册依赖的提供商:
providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }]
现在,在@Inject装饰器的帮助下,这个配置对象可以注入到任何需要它的构造函数中:
constructor(@Inject(APP_CONFIG) config: AppConfig) {this.title = config.title;
}
- 虽然ConfigAppConfig接口在依赖注入过程中没有任何作用,但它为该类中的配置对象提供了强类型信息。
或者在 ngModule 中提供并注入这个配置对象,如AppModule。
providers: [UserService,{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
]
总结
关于Inject和Optional的说明,这里没有说明,具体的可以的可以参照上面表格去查看官方教程.
其他资料
中文官方文档
英文官方文档
查看源代码
演示地址
如要转载,请保持本文完整,并注明作者luamas和本文原始地址:https://blog.luamas.com/2017/03/25/angular2-006-dependency-injection/
转载于:https://my.oschina.net/stategrace/blog/867240
Angular2学习笔记(六) Angular2 依赖注入相关推荐
- 《Pro ASP.NET MVC 3 Framework》学习笔记之五【依赖注入及ninject工具使用】
一,创建松耦合的组件 1."分解关注点"是MVC模式里面一个非常重要的特性.我们想要在应用程序里面创建的组件尽可能的独立,这样我们就能管理比较少的依赖关系.理想情况下,每个组件都是 ...
- angular学习(六)—— 依赖注入
转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/53409171 依赖注入 依赖注入(DI)是一种处理组件如何获得依赖的软件设计模 ...
- Angular学习笔记四之依赖注入与服务
一.依赖注入 (一)依赖注入理解 先来看一段代码: class Engine {// Engine类的构造函数,需要接受一个number类型的参数constructor(speed: number) ...
- Spring.NET学习笔记10——方法的注入(基础篇) Level 200
多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...
- Ethernet/IP 学习笔记六
Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...
- 吴恩达《机器学习》学习笔记六——过拟合与正则化
吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...
- ROS学习笔记六:理解ROS服务和参数
ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- JS学习笔记六:js中的DOM操作
1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...
最新文章
- R使用neuralnet包构建神经网络回归模型并与线性回归模型对比实战
- 25 张图读懂「文件系统」
- Android stadio 关联源码
- Android事件流程详解
- pytorch问题汇总
- mysql 存储过程与存储函数
- Git初学使用命令记录
- java 6 损坏,Java 异常处理六
- Xcode增加头文件搜索路径的方法
- 3、Keras中的顺序模型Sequential和函数式模型Model
- BP神经网络模型介绍
- Java 验证身份证号码
- 安装VS2010旗舰版时出现.Net framework4.0,安装失败
- 2021-08-11好奇心
- 数据分析真题日刷 | 网易2018校园招聘数据分析工程师笔试卷
- python in arcgis_终于晓得arcgis-python入门教程
- 如何使用 PowerShell 锁定、解锁、启用和禁用 AD 帐户
- 搭建Gitea和Drone环境
- Python学习笔记05----条件、循环及其他语句
- 如何下载因特尔显卡的最新驱动