有没有办法将服务从父组件注入到组件中?



所以我有一个表组件。但是表组件需要使用适当的 API 服务,具体取决于它是由组件 A 还是组件 B 调用的。

例如,如果 ComponentB 使用 TableComponent,那么它需要让 TableComponent 注入 APIForB 服务并使用它来填充表。

角度新手,所以不确定这样的事情是否可能。

那么角度的DI系统是分层的,这意味着:

服务是喷油器范围内的单例

每当 Angular 创建组件实例时,它都会创建具有自己的服务实例的嵌套注入器,这些组件在其@Component装饰器中定义providers

对你来说,这意味着你可以为组件提供不同的服务实现,这些服务实现必须扩展相同的抽象类,并将抽象类注入到你的TableComponent

APIService:

export abstract class APIService{
yourMethod1:() => void ;
...
}

您必须将基类定义为抽象类而不是接口,因为接口在运行时不存在,因此它们不是有效的 DI 令牌。

APIforAService

/APIforBService:

@Injectable()
export class APIforAService implements APIService{
youMethod1Implementation(){...}
....
}

当然,您对APIforBService执行相同的操作,但对不同的实现执行。

表组件

现在在您的TableComponent中,您注入APIService但没有定义任何提供程序!

@Component({
selector: 'your-selector',
templateUrl: '',
providers: []
})
export class TableComponent {
constructor(private apiService: APIService) {
}
}

组件 A/B

现在,在组件 A 和组件 B 中,您可以定义相应的提供程序:

@Component({
selector: 'componentA',
templateUrl: '',
providers: [{
provide:APIService,
useClass:APIforAService
}]
})
export class ComponentA {

}

在这里,您也可以对ComponentB执行相同的操作并使用APIforBService

由于分层 DI-System,如果从ComponentA实例化,您的TableComponentAPIforAService,如果从ComponentB实例化,则APIforBService

最好的方法是注入父组件并使用其服务。 为了简化注入和键入,您可以为所有这些 TableContaiers 创建一个超类

export abstract class TableContainer {
constructor(public apiService: SomeServiceTypeIfYouHaveIt) {};
}
// ..................
@Component({
...,
providers: [{ provide: TableContainer, useExisting: ComponentA }]
})
export class ComponentA extends TableContainer {
constructor(service: MyService) { super(service); }
} 
// ..................
export class TableComponent {
constructor(private parent: TableContainer) {}

apiCall() {
this.parent.apiService.doSmth();
}
}

最新更新