Я реализовал решение, используя @ContentChildren декоратор , который чем-то похож на ответ .
Согласно документам , этот декоратор:
Получите 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