在模块上定义的服务能否注入在同一模块声明的组件上定义的服务
Can a service defined on a module inject a service defined on a component declared by the same module
模块 'my' 上定义的服务能否注入模块 'my' 声明的组件上定义的服务?
我测试过好像是这样,所以这个问题主要是为了确认。所以,我有这个定义 ComboFeatureService
:
的组件
@Component({
selector: 'combo-feature',
providers: [ComboFeatureService],
template: '<div>I am feature</div>'
})
export class ComboFeature {
constructor(comboService: ComboService) {
comboService.report();
}
}
然后我有一个服务依赖于ComboFeatureService
:
@Injectable()
export class ComboService {
constructor(public comboFeature: ComboFeatureService) {
}
组件和服务都定义在同一个模块上:
@NgModule({
providers: [ComboService],
declarations: [ComboFeature],
exports: [ComboFeature]
})
export class ComboModule {
我的理解是否正确,即使它们都定义在同一个模块上,ComboService
也无法访问 ComboFeatureService
?
如果是这样,那么据我了解,组件注入器 不是 根注入器的子项,对吗?
服务是否在同一个模块上定义并不重要(除非这是惰性加载模块),模块providers
属于根注入器。
为此,应在当前注入器上定义两个提供程序:
@Component({
...
providers: [ComboService, ComboFeatureService]
})
export class ComboFeature {
constructor(comboService: ComboService) { ... }
或者,ComboFeatureService
可以作为可选注入,这将允许 ComboService
使用当前注入器的 ComboFeatureService
(如果有 none,则什么都不用):
@Injectable()
export class ComboService {
constructor(Optional() public comboFeature: ComboFeatureService) { ... }
提供程序是从需要它们的组件中查找的。如果未找到提供者搜索,则在父级继续搜索,直到到达根注入器(提供者添加到 non-lazy 加载模块的 @NgModule(...)
)。
这意味着您在模块中提供的服务无法注入组件提供的服务,因为它需要从根注入器向叶子进行搜索,而这不会发生。只有相反的方法才有效。需要在相同或更高级别提供依赖项。
模块 'my' 上定义的服务能否注入模块 'my' 声明的组件上定义的服务?
我测试过好像是这样,所以这个问题主要是为了确认。所以,我有这个定义 ComboFeatureService
:
@Component({
selector: 'combo-feature',
providers: [ComboFeatureService],
template: '<div>I am feature</div>'
})
export class ComboFeature {
constructor(comboService: ComboService) {
comboService.report();
}
}
然后我有一个服务依赖于ComboFeatureService
:
@Injectable()
export class ComboService {
constructor(public comboFeature: ComboFeatureService) {
}
组件和服务都定义在同一个模块上:
@NgModule({
providers: [ComboService],
declarations: [ComboFeature],
exports: [ComboFeature]
})
export class ComboModule {
我的理解是否正确,即使它们都定义在同一个模块上,ComboService
也无法访问 ComboFeatureService
?
如果是这样,那么据我了解,组件注入器 不是 根注入器的子项,对吗?
服务是否在同一个模块上定义并不重要(除非这是惰性加载模块),模块providers
属于根注入器。
为此,应在当前注入器上定义两个提供程序:
@Component({
...
providers: [ComboService, ComboFeatureService]
})
export class ComboFeature {
constructor(comboService: ComboService) { ... }
或者,ComboFeatureService
可以作为可选注入,这将允许 ComboService
使用当前注入器的 ComboFeatureService
(如果有 none,则什么都不用):
@Injectable()
export class ComboService {
constructor(Optional() public comboFeature: ComboFeatureService) { ... }
提供程序是从需要它们的组件中查找的。如果未找到提供者搜索,则在父级继续搜索,直到到达根注入器(提供者添加到 non-lazy 加载模块的 @NgModule(...)
)。
这意味着您在模块中提供的服务无法注入组件提供的服务,因为它需要从根注入器向叶子进行搜索,而这不会发生。只有相反的方法才有效。需要在相同或更高级别提供依赖项。