我有一个组件A
和B
<div class="A">
<div class="A1"></div>
<div class="A2"></div>
</div>
<div class="B">
<!--want to display <div class="A1"></div> here-->
</div>
组件B
不包含组件A
或绕过
<componentA></componentA>
<componentB></componentB>
我试图将<div class="A1"></div>
包装到 ng-template
然后在componentB
中我正在查询它,但它总是undefined
:
@ViewChild('templ') templ: TemplateRef<any>;
然后我意识到@ViewChild
是查询组件子组件,那么<ng-template>
它不是子组件,您将如何查询和呈现?
看看Alex Rickabaugh的这个很棒的sideNav示例,它演示了你所需要的。
基于此,您需要在ComponentA
中定义一个ng-container
。然后,您需要使用自定义指令标记ComponentB
的一部分,并且有一个连接ComponentA
和ComponentB
的服务:
<div class="A1"><div>
<div class="A2" *leftNav >
<h3>Content</h3>
</div>
命令:
@Directive({
selector: '[leftNav]',
})
export class LeftNavDirective implements OnInit {
constructor(private leftNav: LeftNav, private ref: TemplateRef<any>) {}
ngOnInit(): void {
this.leftNav.setContents(this.ref);
}
}
服务:
@Injectable()
export class LeftNav {
private _state = new BehaviorSubject<TemplateRef<any>|null>(null);
readonly contents = this._state.asObservable();
setContents(ref: TemplateRef<any>): void {
this._state.next(ref);
}
clearContents(): void {
this._state.next(null);
}
}
最后,在您的ComponentB
中,您必须在ngAfterViewInit
上订阅您的<div class="A1"> ... <div>
内容:
ngAfterViewInit(): void {
this
.leftNav
.contents
.subscribe(ref => {
if (this._current !== null) {
this._current.destroy();
this._current = null;
}
if (ref === null) {
return;
}
this._current = this.vcr.createEmbeddedView(ref);
});
}
附言有关于该主题的视频和幻灯片。
将组件A
的模板呈现为组件B
的内容
<ComponentB>
<ComponentA></ComponentA>
</ComponentB>
componentB
渲染"内容"的内部模板(在本例中ComponentA
模板(
ComponentB.component.html
<ng-content> </ng-content>
若要访问ComponentB
中呈现的ComponentA
,请使用ContentChild
@ContentChild(ComponentA) footer: componentA;
您可以在父组件中创建公共ng-template
,并将其templateRef
传递给组件绑定中的子组件Input
。稍后,内部组件将填充该模板的模板绑定。
这意味着在两个组件中添加@Input a1: TemplateRef<any>;
,并让我们在组件A和B的父组件的父组件中放入以下ng-template
(基本上它们具有相同的父组件(。
<ng-template #a1>
<div class="A1">
{{item.Description}}
</div>
</ng-tmeplate>
组件 A 模板
<div class="A">
<ng-container
*ngTemplateOutlet="a1;context:{item: valueFromComponentA}">
</ng-container>
<div class="A2"></div>
</div>
组分B 替泊酸酯
<div class="B">
<ng-container
*ngTemplateOutlet="a1;context:{item: valueFromComponentB}">
</ng-container>
</div>