关于angular2提供者的一些问题
Some questions about angular2 providers
抱歉,我是编程新手,没有朋友知道这个话题,所以我要用我愚蠢的问题淹没 Whosebug。
我可以在 bootstrap 级别设置供应商
bootstrap(AppComponent, [Service]);
在根组件中
@Component({
providers: [Service],
//...
或在子组件级别。
本期问题:
- 我会简化,但是如果someService 设置为someComponent 的提供者,是否意味着someComponent 具有someService 的字段和方法?
提供者提供服务的方法和字段给组件来实例化新的实例?
- 已删除
- 如果我提供服务,它的方法可以以某种方式在较低级别调用?
- 如果 someComponent 注入了 someService,其中注入了 someService2,我是否需要在 someComponent 级别上将它们 [someService, someService2] 都设置为提供者?如果我已经在上层组件中注入了 someService2 somewere or/and?
- 为什么 HTTP_PROVIDERS 设置在 bootstrap 级别?
您应该阅读开发指南中的 Hierarchical Injectors。它会回答你的大部分问题。
当组件有 providers: [MyService]
行时,表示该组件和所有子组件将共享服务的 same/single 实例。
如果一个服务需要注入另一个服务,它将查找组件树以找到所需服务的提供者,并使用它首先找到的提供者。
HTTP_PROVIDERS经常设置在bootstrap因为我们往往只想要这些classes/services.
的一个实例
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
也请求 MyService
DI 时,DI 将 return bootstrap()
之一,因为向上的层次结构没有其他提供 MyService
。
如果您想与整个应用程序共享一些数据,只需在 bootstrap()
上注册您要用于共享数据的服务。
1.
如果一个组件('sub-component')有一个像
这样的构造函数
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. And if someComponent inject someService, in which injected someService2, do I need to set as provider both of them [someService, someService2] on level of someComponent? And if I already inject someService2 somewere or/and in upper-level-component?
当组件 class 或服务 class 由 Angular 创建时,它使用 DI。它查找所请求类型的提供者并创建一个实例或使用现有实例。当 DI 创建实例时,它会检查该类型的构造函数并再次查找这些类型的提供者。这在任意级别递归,(即使在 DI 需要一些帮助的循环中)
所以,简短的回答:是的。 DI 注入的所有内容都需要注册提供者。
5. Why HTTP_PROVIDERS set's up in bootstrap-level?
HTTP_PROVIDERS
提供的classes可以被整个应用程序重用。不需要为每个 HTTP 请求创建一个新实例,也不需要每个组件或服务都有自己的 Http
class 实例。如果您希望特定组件使用不同的 Http
class,您可以将特定的 Http
class 添加到该组件的提供者列表中。此组件及其所有 sub-components 将改用此提供程序。
export class MySpecialHttp {
}
@Component(selector: 'sub-sub',
providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
constructor(http: Http) {}
}
这里我们指示 DI,当 SubSubComponent
或其中之一 child-components 请求 Http
时,改为传入 MySpecialHttp
。
抱歉,我是编程新手,没有朋友知道这个话题,所以我要用我愚蠢的问题淹没 Whosebug。
我可以在 bootstrap 级别设置供应商
bootstrap(AppComponent, [Service]);
在根组件中
@Component({
providers: [Service],
//...
或在子组件级别。
本期问题:
- 我会简化,但是如果someService 设置为someComponent 的提供者,是否意味着someComponent 具有someService 的字段和方法? 提供者提供服务的方法和字段给组件来实例化新的实例?
- 已删除
- 如果我提供服务,它的方法可以以某种方式在较低级别调用?
- 如果 someComponent 注入了 someService,其中注入了 someService2,我是否需要在 someComponent 级别上将它们 [someService, someService2] 都设置为提供者?如果我已经在上层组件中注入了 someService2 somewere or/and?
- 为什么 HTTP_PROVIDERS 设置在 bootstrap 级别?
您应该阅读开发指南中的 Hierarchical Injectors。它会回答你的大部分问题。
当组件有 providers: [MyService]
行时,表示该组件和所有子组件将共享服务的 same/single 实例。
如果一个服务需要注入另一个服务,它将查找组件树以找到所需服务的提供者,并使用它首先找到的提供者。
HTTP_PROVIDERS经常设置在bootstrap因为我们往往只想要这些classes/services.
的一个实例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
也请求 MyService
DI 时,DI 将 return bootstrap()
之一,因为向上的层次结构没有其他提供 MyService
。
如果您想与整个应用程序共享一些数据,只需在 bootstrap()
上注册您要用于共享数据的服务。
1.
如果一个组件('sub-component')有一个像
这样的构造函数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. And if someComponent inject someService, in which injected someService2, do I need to set as provider both of them [someService, someService2] on level of someComponent? And if I already inject someService2 somewere or/and in upper-level-component?
当组件 class 或服务 class 由 Angular 创建时,它使用 DI。它查找所请求类型的提供者并创建一个实例或使用现有实例。当 DI 创建实例时,它会检查该类型的构造函数并再次查找这些类型的提供者。这在任意级别递归,(即使在 DI 需要一些帮助的循环中)
所以,简短的回答:是的。 DI 注入的所有内容都需要注册提供者。
5. Why HTTP_PROVIDERS set's up in bootstrap-level?
HTTP_PROVIDERS
提供的classes可以被整个应用程序重用。不需要为每个 HTTP 请求创建一个新实例,也不需要每个组件或服务都有自己的 Http
class 实例。如果您希望特定组件使用不同的 Http
class,您可以将特定的 Http
class 添加到该组件的提供者列表中。此组件及其所有 sub-components 将改用此提供程序。
export class MySpecialHttp {
}
@Component(selector: 'sub-sub',
providers: [provide(Http, {useClass: MySpecialHttp})]
export class SubSubComponent {
constructor(http: Http) {}
}
这里我们指示 DI,当 SubSubComponent
或其中之一 child-components 请求 Http
时,改为传入 MySpecialHttp
。