这里有一个有趣的内容投影和依赖注入的组合.
<ng-template #editTemplate>
正在将内容投影到Parent
组件中
<Parent>
<ng-template #editTemplate> <--- projected into <Parent>
<button>Edit Me </button>
</ng-template>
</Parent>
所以Parent
通过Content Child直接引用它,如果Parent
组件看起来像这样:
@Component({
selector: 'parent',
template: `
<h2>Parent here!</h2>
<ng-content></ng-content> <--- #editTemplate will get projected here
<child1></child1>
`,
styles: [`h1 { font-family: Lato; }`],
})
export class ParentComponent {
@ContentChild('editTemplate') editTemplate: TemplateRef<any>; // <--- reference to #editTemplate
}
然而,child4
嵌套了好几层,因此依赖注入在这里是您的朋友,否则您需要配置一个引用in each layer来完成从Parent
到child4
的链.
不过,使用DI,您可以将Parent
组件直接注入child4
,然后child4
可以访问Parent
组件实例上的editTemplate
引用,并使用*ngTemplateOutlet插入TemplateRef
中的视图.
所以child4
个可能是这样的:
@Component({
selector: 'child4',
template: `
<h3>Child 4 here!</h3>
<div>And here's the injected template:</div>
<ng-container *ngTemplateOutlet="projectedTemplate"></ng-container> <--- use *ngTemplateOutlet to render editTemplate
`,
styles: [`h1 { font-family: Lato; }`],
})
export class Child4Component {
projectedTemplate: TemplateRef<any>;
constructor(private parentComponent: ParentComponent) {} // <-- inject ParentComponent instance
ngOnInit() {
this.projectedTemplate = this.parentComponent.editTemplate; // <-- set *ngTemplateOutlet to editTemplate
}
}
Here's a StackBlitz显示此方法.