@ContentChildren dekoratörünü kullanarak bir çözüm uyguladım , bu bir şekilde @ Lerner'ın cevabına benzer.
Belgelere göre , bu dekoratör:
İçerik DOM'dan öğeler veya yönergelerin QueryList'ini alın. Bir alt öğe eklendiğinde, kaldırıldığında veya taşındığında, sorgu listesi güncellenecek ve sorgu listesindeki gözlemlenebilir değişiklikler yeni bir değer yayınlayacaktır.
Dolayısıyla, üst bileşendeki gerekli kod şöyle olacaktır:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
Bileşen sınıfında:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Ardından, bileşen şablonunda:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Tam örnek : https://stackblitz.com/edit/angular-jjjdqb
Bu çözümü matSuffix, form alanı bileşeni için açısal bileşenlerde uygulanmış buldum .
Bileşenin içeriği daha sonra enjekte edilen durumda, sonra uygulama başlatıldığını, biz de abone olarak, reaktif bir uygulama kullanabilirsiniz changesdurumunda 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();
}
}
Tam örnek : https://stackblitz.com/edit/angular-essvnq