Supposons que j'ai un composant de panneau simple Bootstrap avec plusieurs emplacements de transclusion. Exemple de modèle:
<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>
Je veux rendre l'en-tête du panneau facultatif. Comment cacher <div class="panel-heading">
élément, si aucun contenu n'est fourni pour <ng-content select="my-panel-heading"></ng-content>
Si vous avez un élément parent de <ng-content>
avec une variable de modèle (#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>
alors vous pouvez l'interroger comme
@ViewChild('panelHeading') panelHeading;
et définir une propriété selon qu'il y a des enfants ou non
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading.nativeElement && this.panelHeading.nativeElement.children.length > 0;
this.cdRef.detectChanges();
}
Si <my-panel-heading>
est un composant Angular2, vous pouvez également utiliser
@ContentChild(MyPanelHeading) panelHeading:MyPanelHeading;
constructor(private cdRef:ChangeDetectorRef) {}
showHeading:boolean = false;
ngAfterViewInit() {
this.showHeading = this.panelHeading != null;
this.cdRef.detectChanges();
}
Vous devriez supprimer tous vos espaces mais vous pouvez le faire avec CSS si vous vous en souciez vraiment (ng-content ne prend pas d'espace):
.panel-heading:empty { display: none }
<div class="panel-heading"><ng-content select="my-panel-heading"></ng-content></div>