Implementé una solución usando el decorador @ContentChildren , que de alguna manera es similar a la respuesta de @ Lerner.
Según los documentos , este decorador:
Obtenga la QueryList de elementos o directivas del DOM de contenido. Cada vez que se agrega, elimina o mueve un elemento secundario, la lista de consultas se actualizará y los cambios observables de la lista de consultas emitirán un nuevo valor.
Entonces, el código necesario en el componente principal será:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
En la clase de componente:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Luego, en la plantilla de componentes:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Ejemplo completo : https://stackblitz.com/edit/angular-jjjdqb
Encontré esta solución implementada en componentes angulares, para matSuffix, en el componente de campo de formulario .
En la situación en la que el contenido del componente se inyecta más tarde, después de inicializar la aplicación, también podemos usar una implementación reactiva, suscribiéndonos al changesevento de 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();
}
}
Ejemplo completo : https://stackblitz.com/edit/angular-essvnq