如何检查ng-content是否存在
How to check whether ng-content exists
假设我有一个简单的 Bootstrap 面板组件,其中包含多个嵌入槽。模板示例:
<div class="panel panel-default">
<div class="panel-heading">
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
我想让 panel-heading 可选。如果没有为 <ng-content select="my-panel-heading"></ng-content>
提供内容,我该如何隐藏 <div class="panel-heading">
元素
如果 <ng-content>
的 parent 元素带有模板变量 (#panelHeading
)
<div class="panel panel-default">
<div class="panel-heading" #panelHeading [hidden]="!showHeading">
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
然后你可以像这样查询
@ViewChild('panelHeading') panelHeading;
并根据有无children设置一个属性
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading.nativeElement && this.panelHeading.nativeElement.children.length > 0;
this.cdRef.detectChanges();
}
如果<my-panel-heading>
是Angular2组件,那么你也可以使用
@ContentChild(MyPanelHeading) panelHeading:MyPanelHeading;
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading != null;
this.cdRef.detectChanges();
}
您必须删除所有 space,但如果您真的关心它,您可以使用 CSS 执行此操作(ng-content 不会占用 space ):
.panel-heading:empty { display: none }
<div class="panel-heading"><ng-content select="my-panel-heading"></ng-content></div>
做:
<div class="panel panel-default">
<div class="panel-heading" [hidden]="!panelHeading.hasChildNodes()" #panelHeading>
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
请注意,在这种情况下,您不能使用 *ngIf
来应对第 22 条军规。
假设我有一个简单的 Bootstrap 面板组件,其中包含多个嵌入槽。模板示例:
<div class="panel panel-default">
<div class="panel-heading">
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
我想让 panel-heading 可选。如果没有为 <ng-content select="my-panel-heading"></ng-content>
<div class="panel-heading">
元素
如果 <ng-content>
的 parent 元素带有模板变量 (#panelHeading
)
<div class="panel panel-default">
<div class="panel-heading" #panelHeading [hidden]="!showHeading">
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
然后你可以像这样查询
@ViewChild('panelHeading') panelHeading;
并根据有无children设置一个属性
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading.nativeElement && this.panelHeading.nativeElement.children.length > 0;
this.cdRef.detectChanges();
}
如果<my-panel-heading>
是Angular2组件,那么你也可以使用
@ContentChild(MyPanelHeading) panelHeading:MyPanelHeading;
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading != null;
this.cdRef.detectChanges();
}
您必须删除所有 space,但如果您真的关心它,您可以使用 CSS 执行此操作(ng-content 不会占用 space ):
.panel-heading:empty { display: none }
<div class="panel-heading"><ng-content select="my-panel-heading"></ng-content></div>
做:
<div class="panel panel-default">
<div class="panel-heading" [hidden]="!panelHeading.hasChildNodes()" #panelHeading>
<ng-content select="my-panel-heading"></ng-content>
</div>
<div class="panel-body">
<ng-content select="my-panel-content"></ng-content>
</div>
</div>
请注意,在这种情况下,您不能使用 *ngIf
来应对第 22 条军规。