Ich habe eine Lösung mit @ContentChildren Decorator implementiert , die der Antwort von @ Lerner irgendwie ähnlich ist.
Laut Docs hat dieser Dekorateur:
Rufen Sie die QueryList der Elemente oder Anweisungen aus dem Inhalts-DOM ab. Jedes Mal, wenn ein untergeordnetes Element hinzugefügt, entfernt oder verschoben wird, wird die Abfrageliste aktualisiert, und die in der Abfrageliste beobachtbaren Änderungen geben einen neuen Wert aus.
Der erforderliche Code in der übergeordneten Komponente lautet also:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
In der Komponentenklasse:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Dann in der Komponentenvorlage:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Vollständiges Beispiel : https://stackblitz.com/edit/angular-jjjdqb
Ich habe diese Lösung in Winkelkomponenten, implementiert gefunden matSuffix
, in der Form-Feld - Komponente.
In der Situation, in der der Inhalt der Komponente später nach der Initialisierung der App eingefügt wird, können wir auch eine reaktive Implementierung verwenden, indem wir das changes
Ereignis abonnieren 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(() => {
// do something when content updates
//
this.hasContent = (this.content.length > 0);
});
}
ngOnDestroy() {
this._subscription.unsubscribe();
}
}
Vollständiges Beispiel : https://stackblitz.com/edit/angular-essvnq