抱歉,我是编程方面的新手,并且没有知道该主题的朋友,所以我将通过愚蠢的问题来解决堆栈溢出问题。
我可以在bootstrap级别设置提供程序
bootstrap(AppComponent, [Service]);
在rootComponent
中@Component({
providers: [Service],
//...
或在子组件级别。
此时的问题:
答案 0 :(得分:2)
第3 强>
依赖注入是分层的
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
的{{1}}因为这是它找到的第一个。如果MyService
还请求bootstrap()
DI,则会返回MyService
之一,因为层次结构向上,没有其他内容提供bootstrap()
。
如果您想与整个应用程序共享某些数据,请仅注册您要用于在export class SubComponent {
constructor(private myService: MyService) {
}
someName: string;
clickHandler($event) {
this.myService.clickHappended = true;
this.someName = this.myService.loadNameFromServer();
}
}
分享数据的服务。
1。
如果组件('子组件')具有类似
的构造函数MyService
然后将myService
的引用分配给SubComponent
,MyServices
中的代码可以读取和写入HTTP_PROVIDERS
字段并调用其方法。
4. 如果someComponent注入了someService,其中注入了someService2,我是否需要在someComponent的级别设置为提供者[someService,someService2]?如果我已经注入someService2 somewere或/和上层组件?
当Angular创建组件类或服务类时,它使用DI。它查找请求类型的提供程序并创建实例或使用现有实例。当DI创建一个实例时,它会检查该类型的构造函数,并再次为这些类型查找提供程序。这在任意级别递归,(即使在DI需要一些帮助的周期中)
所以,简短回答:是的。 DI注入的所有内容都需要注册提供商。
5. 为什么HTTP_PROVIDERS在bootstrap级别设置了?
整个应用程序可以重用Http
提供的类。无需为每个HTTP请求创建新实例,也无需每个组件或服务拥有自己的Http
类实例。如果您希望特定组件使用不同的Http
类,则可以将该特定export class MySpecialHttp {
}
@Component(selector: 'sub-sub',
providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
constructor(http: Http) {}
}
类添加到该组件的提供者列表中。该组件及其所有子组件将使用此提供程序。
SubSubComponent
我们在此指示DI,当Http
或其中一个子组件请求MySpecialHttp
时,请传入void assign(int** a)
{
// ...
}
int main()
{
int** ptr;
assign(ptr);
}
。
答案 1 :(得分:0)
您应该阅读开发指南中的Hierarchical Injectors。它将回答您的大部分问题。
当组件具有providers: [MyService]
行时,表示此组件和所有子组件将共享相同/单个服务实例。
如果服务需要注入另一个服务,它将查找组件树以查找所需服务的提供程序,它将使用它首先找到的服务器。
HTTP_PROVIDERS通常在引导程序中设置,因为我们通常只需要这些类/服务的一个实例。