Я реалізував рішення за допомогою декоратора @ContentChildren , який чимось схожий на відповідь @ Lerner.
Згідно з документами , цей декоратор:
Отримайте QueryList елементів або директив із вмісту DOM. Кожного разу, коли дочірній елемент додається, видаляється або переміщується, список запитів оновлюється, а зміни, що спостерігаються у списку запитів, видають нове значення.
Отже, необхідним кодом у батьківському компоненті буде:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
У класі компонентів:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Потім у шаблоні компонента:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Повний приклад : https://stackblitz.com/edit/angular-jjjdqb
Я знайшов це рішення, реалізоване в кутових компонентах, наприклад matSuffix
, у компоненті поля форми .
У ситуації, коли вміст компонента вводиться пізніше, після ініціалізації програми, ми також можемо використовувати реактивну реалізацію, підписавшись на changes
подію 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();
}
}
Повний приклад : https://stackblitz.com/edit/angular-essvnq