依赖注入是分层
bootstrap()
|-app-component
|-sub-component1
|-sub-component2
|-sub-sub-component21
当Angulars DI实例化的组件或服务,它会检查什么参数的构造期望并试图查找一个匹配提供商。
当sub-sub-component
被创建并且它具有像constructor(myService: MyService)
这样的构造函数时,DI开始从sub-sub-components
提供者向上查找,如果它找到匹配的提供者。如果它到达`bootstrap()并且仍然没有找到它,它会失败并显示一条错误消息。
对于层次结构中的每个级别,只创建一个提供者的一个实例。 当MyService
在bootstrap()
中注册为提供者时,则任何请求MyService
的组件都将被传入在bootstrap()
中创建的同一实例中。
当MyService
是也在sub-component2
注册,那么当sub-sub-component
请求MyService
将得到sub-component2
的一个,因为这是第一次发现。当sub-component1
也要求MyService
DI将返回bootstrap()
之一,因为层次向上没有别的提供MyService
。
如果您想与整个应用程序共享一些数据,请只注册您想使用的服务用于共享数据bootstrap()
。
1.
如果一个组件( '子组件')具有像
export class SubComponent {
constructor(private myService: MyService) {
}
someName: string;
clickHandler($event) {
this.myService.clickHappended = true;
this.someName = this.myService.loadNameFromServer();
}
}
然后到MyService
一个引用被分配给myService
和代码在构造SubComponent
可以读取和写入MyServices
的字段并调用其方法。
4.如果someComponent注入someService,所注入的someService2,我是否需要将其设置为供应商两者[someService,someService2]上someComponent的水平?如果我已经注入了一些服务2有些是/或在上层组件?
当组件类或服务类由Angular创建时,它使用DI。它查找所需类型的提供者并创建一个实例或使用现有的实例。当DI创建实例时,它会检查该类型的构造函数,并再次查找这些类型的提供者。这是递归的任意级别,(即使在DI需要一些帮助的周期)
所以,简短的回答:是的。 DI注入的所有东西都需要注册供应商。
5.为什么HTTP_PROVIDERS设置在引导级别?
由HTTP_PROVIDERS
提供的类可以被整个应用程序重用。不需要为每个HTTP请求创建一个新实例,也不需要每个组件或服务都拥有自己的Http
类的实例。如果您希望特定组件使用不同的Http
类,则可以将该特定的Http
类添加到该组件的提供程序列表中。此组件及其所有子组件将使用此提供程序。
export class MySpecialHttp {
}
@Component(selector: 'sub-sub',
providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
constructor(http: Http) {}
}
这里我们指示DI,当它SubSubComponent
或自己小孩的组件请求Http
,传递MySpecialHttp
代替。