前言:依赖注入的完整逻辑就不在这里赘述了,简单可以理解为di框架帮我们将原来需要手动实例化服务(不局限于服务,还可以是组件,指令等)的方式改为依赖注入的方式,即我们只需要申明需要哪些依赖,di框架会帮我们自动实例化(传入对应所需要的参数),然后返回我们所需的实例,
什么是解析修饰符和依赖提供者
解析修饰符
可以使用 @Optional(),@Self(),@SkipSelf() 和 @Host() 来修饰 Angular 的解析行为
依赖提供者
可以使用providers和viewProviders
解析修饰符的用法
@Optional() :将参数标记为可选依赖项。如果找不到依赖项,则 DI 框架提供 null。这个最好理解,最不容易出现误解,即修饰当前的依赖为非必须的依赖,如果我们在不使用这个修饰符的情况下,在依赖树中如果没有查询到这个依赖就会报错,而这个就是用来做兜底的,避免因为依赖没有注入而报错
@SkipSelf():该参数指示 DI 框架从父注入器启动依赖项解析。解析器在注入器层次结构中向上查找,因此不会检查本地注入器的提供者。跳过当前,即在当前依赖树中搜索服务时直接跳过当前宿主组件(即自己)
@Self():该装饰器告诉 DI 框架从本地注入器开始解析依赖项。使用自己的,即在当前依赖树中搜索服务时限制只能使用自己的
@Host():指示 DI 框架通过检查子元素的注入器来解析视图,并在到达当前组件的宿主元素时停止,这里是最不好理解的,一般用文档里的这句话来理解 导致注入器开始查找,直到遇到 <#VIEW> 的边缘
这个就好理解多了,只需要我们将对应的组件结构换成对应的心智模型,然后查找服务时遵守这个条件,先从组件本身开始查找,直接遇到<#VIEW>停止查找
有如下心智模型: