1

在模块“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

如果是这种情况,那么据我所知,组件注入器不是根注入器的子代,对吗?

4

2 回答 2

3

服务是否定义在同一个模块上并不重要(除非这是延迟加载的模块),模块providers属于根注入器。

为此,应在当前注入器上定义两个提供程序:

@Component({
    ...
    providers: [ComboService, ComboFeatureService]
})
export class ComboFeature {
    constructor(comboService: ComboService) { ... }

或者,ComboFeatureService可以作为可选注入,这将允许从当前注入器ComboService使用ComboFeatureService(如果没有,则不使用):

@Injectable()
export class ComboService {
    constructor(Optional() public comboFeature: ComboFeatureService) { ... }
于 2017-01-23T11:16:07.803 回答
2

从需要它们的组件中查找提供者。如果未找到提供程序搜索,则在父级继续搜索,直到到达根注入器(添加到@NgModule(...)非延迟加载模块的提供程序)。

这意味着您在模块中提供的服务无法注入组件提供的服务,因为它需要从根注入器搜索叶子,这不会发生。只有反过来才有效。需要在相同或更高级别提供依赖关系。

于 2017-01-23T11:21:02.310 回答