我有三个组件,其中componentC
显示为componentB
的内容,并在其构造函数中获取componentB
DI。
@Component({
selector: 'componentA',
template: `
<componentB>
<componentC></componentB>
<ng-content></ng-content>
</componentB>`
....
export class ComponentC {
constructor(private cmpB: ComponentB)
现在我使用其他组件中的componentA
,并希望通过我componentC
&#39;中<ng-content>
的{{1}}使用翻译为其提供额外的componentA
。模板:
<componentA>
<componentC></componentC>
</componentA>
这会触发No provider for ComponentB
。使用<ng-content>
,我定义了内容应该出现在<componentB>
内,因此DI应该能够找到作为插入点父节点的ComponentB
对象。
这种情况可能吗? Angular是否直接在目标位置创建我的额外ComponentC
,或者首先在标记位置移动它?有没有办法配置提供程序来执行此操作?
答案 0 :(得分:0)
转换不会使componentC
成为componentB
的孩子,它仍然是componentA
的孩子,只是在DOM中显示的位置被更改。
我没有看到一种简单的注射方法。
您可以componentA
提供componentA
分配对componentB
@Component({
...
providers: [ComponentBProviderService],
class ComponentA {
@ViewChild(ComponentB) componentB:ComponentB;
constructor(private bProvider: ComponentBProviderService){}
ngAfterViewInit() {
this.bProvider.component = this.componentB;
}
}
当ComponentC
注入此服务时,它将可以访问componentB
。
在服务中使用Observable
是有意义的,以便在引用可用时主动通知componentC
。
class ComponentC {
componentB:ComponentB;
constructor(bProvider: ComponentBProviderService){
bProvider.componentAvailable.subscribe(val => this.componentB = val);
}
}