Wdrożyłem rozwiązanie za pomocą dekoratora @ContentChildren , które jest w pewnym sensie podobne do odpowiedzi @ Lernera.
Według dokumentów ten dekorator:
Pobierz QueryList elementów lub dyrektyw z zawartości DOM. Za każdym razem, gdy element podrzędny jest dodawany, usuwany lub przenoszony, lista zapytań zostanie zaktualizowana, a obserwowane zmiany na liście zapytań będą emitować nową wartość.
Zatem niezbędnym kodem w komponencie nadrzędnym będzie:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
W klasie komponentów:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Następnie w szablonie komponentów:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Pełny przykład : https://stackblitz.com/edit/angular-jjjdqb
Znalazłem to rozwiązanie zaimplementowane w komponentach kątowych, dla matSuffix
, w polu formularza komponencie .
W sytuacji, gdy zawartość komponentu jest wstrzykiwana później, po zainicjowaniu aplikacji, możemy również skorzystać z implementacji reaktywnej, subskrybując changes
zdarzenie 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();
}
}
Pełny przykład : https://stackblitz.com/edit/angular-essvnq