关于angular2提供者的一些问题
对不起,我是编程新手,没有一个朋友知道这个话题,所以我会被我愚蠢的问题淹没 我可以在引导级别设置提供程序关于angular2提供者的一些问题,angular,angular2-services,Angular,Angular2 Services,对不起,我是编程新手,没有一个朋友知道这个话题,所以我会被我愚蠢的问题淹没 我可以在引导级别设置提供程序 bootstrap(AppComponent, [Service]); 根组件中的 @Component({ providers: [Service], //... 或在子组件级别 本次提问: 我会简化,但如果someService集是someComponent的提供者,这是否意味着someComponent具有someService的字段和方法? 提供者是否为组件提供服
bootstrap(AppComponent, [Service]);
根组件中的
@Component({
providers: [Service],
//...
或在子组件级别
本次提问:
providers:[MyService]
行时,这意味着该组件和所有子组件将共享同一个/单个服务实例
如果一个服务需要注入另一个服务,它将查找组件树以找到所需服务的提供者,并使用它首先找到的提供者
HTTP_提供者通常在引导中设置,因为我们通常只需要这些类/服务的一个实例
3.
依赖注入是分层的
bootstrap()
|-app-component
|-sub-component1
|-sub-component2
|-sub-sub-component21
当Angulars DI实例化组件或服务时,它会检查构造函数期望的参数,并尝试查找匹配的提供程序
当创建了子组件
并且它有一个类似构造函数(myService:myService)
的构造函数时,DI开始从子组件
提供者向上查看是否找到了匹配的提供者。如果它到达'bootstrap(),但仍然没有找到,它将失败并显示错误消息
对于层次结构中的每个级别,只创建一个提供程序实例。
当MyService
在bootstrap()
中注册为提供者时,任何请求MyService
的组件都将在bootstrap()中创建的相同实例中被传递
当MyService
也在sub-component2
中注册时,当sub-sub-component
请求MyService
时,它将从sub-component2
中获取该服务,因为这是它找到的第一个。当子组件1
也请求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
,而子组件中的代码可以读写MyService
s字段并调用其方法
4.如果someComponent注入了someService,其中注入了someService2,我是否需要在someComponent级别将它们两个[someService,someService2]都设置为提供者?如果我已经在上层组件中注入了someservice2somewere或/和
当Angular创建组件类或服务类时,它使用DI。它查找请求类型的提供程序,并创建实例或使用现有实例。当DI创建实例时,它会检查该类型的构造函数,并再次查找这些类型的提供程序。这在任意级别递归进行(即使在DI需要一些帮助的循环中也是如此)
所以,简短的回答是:是的。DI注入的所有内容都需要注册的提供者
5.为什么HTTP\U提供程序设置为引导级
HTTP_提供者提供的类可以被整个应用程序重用。不需要为每个HTTP请求创建新实例,也不需要每个组件或服务都有自己的HTTP
类实例。如果希望特定组件使用不同的Http
类,可以将该特定Http
类添加到该组件的提供者列表中。此组件及其所有子组件将改用此提供程序
export class MySpecialHttp {
}
@Component(selector: 'sub-sub',
providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
constructor(http: Http) {}
}
这里我们指示DI,当子组件
或它的子组件之一请求Http
时,将MySpecialHttp
传递给DI