如何检查ng-content是否存在

hen*_*rix 20 transclusion angular

假设我有简单的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>
Run Code Online (Sandbox Code Playgroud)

我想让panel-heading可选.<div class="panel-heading">如果没有提供内容,我如何隐藏元素<ng-content select="my-panel-heading"></ng-content>

Gün*_*uer 20

如果你的父元素<ng-content>带有模板变量(#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>
Run Code Online (Sandbox Code Playgroud)

然后你可以查询它

@ViewChild('panelHeading') panelHeading;
Run Code Online (Sandbox Code Playgroud)

并根据是否有孩子设置属性

constructor(private cdRef:ChangeDetectorRef) {}

showHeading:boolean = false;

ngAfterViewInit() {
  this.showHeading = this.panelHeading.nativeElement && this.panelHeading.nativeElement.children.length > 0;
  this.cdRef.detectChanges();
}
Run Code Online (Sandbox Code Playgroud)

如果<my-panel-heading>是Angular2组件,那么您也可以使用

@ContentChild(MyPanelHeading) panelHeading:MyPanelHeading;

constructor(private cdRef:ChangeDetectorRef) {}

showHeading:boolean = false;

ngAfterViewInit() {
  this.showHeading = this.panelHeading != null;
  this.cdRef.detectChanges();
}
Run Code Online (Sandbox Code Playgroud)

  • 有一些生命周期回调,当在此回调中更改模型时,会导致异常(“模型在检查后已更改”或类似)。调用“detectChanges”修复了此异常。 (2认同)

Wil*_*ely 18

您必须删除所有空间,但如果您真的关心它(ng-content不占用空间),您可以使用CSS执行此操作:

.panel-heading:empty { display: none }

<div class="panel-heading"><ng-content select="my-panel-heading"></ng-content></div>
Run Code Online (Sandbox Code Playgroud)