J'ai implémenté une solution en utilisant @ContentChildren décorateur , qui est en quelque sorte similaire à la réponse de @ Lerner.
Selon la documentation , ce décorateur:
Obtenez la QueryList des éléments ou des directives du DOM de contenu. Chaque fois qu'un élément enfant est ajouté, supprimé ou déplacé, la liste de requêtes sera mise à jour et les modifications observables de la liste de requêtes émettront une nouvelle valeur.
Ainsi, le code nécessaire dans le composant parent sera:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
Dans la classe de composants:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Ensuite, dans le modèle de composant:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Exemple complet : https://stackblitz.com/edit/angular-jjjdqb
J'ai trouvé cette solution implémentée dans des composants angulaires, pour matSuffix
, dans le composant form-field .
Dans la situation où le contenu du composant est injecté ultérieurement, après l'initialisation de l'application, on peut également utiliser une implémentation réactive, en souscrivant à l' changes
événement du QueryList
:
export class MyComponentComponent implements AfterContentInit, OnDestroy {
private _subscription: Subscription;
public hasContent: boolean;
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
constructor() {}
ngAfterContentInit(): void {
this.hasContent = (this.content.length > 0);
this._subscription = this.content.changes.subscribe(() => {
this.hasContent = (this.content.length > 0);
});
}
ngOnDestroy() {
this._subscription.unsubscribe();
}
}
Exemple complet : https://stackblitz.com/edit/angular-essvnq