angular学习日记-@Host,@Self,@SkipSelf,@Optional,配合providers和viewProviders的使用

279 阅读2分钟

前言:依赖注入的完整逻辑就不在这里赘述了,简单可以理解为di框架帮我们将原来需要手动实例化服务(不局限于服务,还可以是组件,指令等)的方式改为依赖注入的方式,即我们只需要申明需要哪些依赖,di框架会帮我们自动实例化(传入对应所需要的参数),然后返回我们所需的实例,

什么是解析修饰符和依赖提供者

解析修饰符

可以使用 @Optional()@Self()@SkipSelf() 和 @Host() 来修饰 Angular 的解析行为

依赖提供者

可以使用providers和viewProviders

解析修饰符的用法

@Optional() :将参数标记为可选依赖项。如果找不到依赖项,则 DI 框架提供 null。这个最好理解,最不容易出现误解,即修饰当前的依赖为非必须的依赖,如果我们在不使用这个修饰符的情况下,在依赖树中如果没有查询到这个依赖就会报错,而这个就是用来做兜底的,避免因为依赖没有注入而报错

@SkipSelf()该参数指示 DI 框架从父注入器启动依赖项解析。解析器在注入器层次结构中向上查找,因此不会检查本地注入器的提供者。跳过当前,即在当前依赖树中搜索服务时直接跳过当前宿主组件(即自己)

@Self()该装饰器告诉 DI 框架从本地注入器开始解析依赖项。使用自己的,即在当前依赖树中搜索服务时限制只能使用自己的

@Host()指示 DI 框架通过检查子元素的注入器来解析视图,并在到达当前组件的宿主元素时停止,这里是最不好理解的,一般用文档里的这句话来理解 导致注入器开始查找,直到遇到 <#VIEW> 的边缘 这个就好理解多了,只需要我们将对应的组件结构换成对应的心智模型,然后查找服务时遵守这个条件,先从组件本身开始查找,直接遇到<#VIEW>停止查找

有如下心智模型:

image.png