Implementei uma solução usando o decorador @ContentChildren , que é semelhante à resposta de @Lerner .
De acordo com a documentação , este decorador:
Obtenha a QueryList de elementos ou diretivas do conteúdo DOM. Sempre que um elemento filho é adicionado, removido ou movido, a lista de consulta será atualizada e as alterações observáveis na lista de consulta emitirão um novo valor.
Portanto, o código necessário no componente pai será:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
Na classe do componente:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Então, no modelo de componente:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Exemplo completo : https://stackblitz.com/edit/angular-jjjdqb
Eu encontrei esta solução implementada em componentes angulares, para matSuffix, no componente de campo de formulário .
Na situação em que o conteúdo do componente é injetado posteriormente, depois que o aplicativo é inicializado, também podemos usar uma implementação reativa, inscrevendo-se no 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();
}
}
Exemplo completo : https://stackblitz.com/edit/angular-essvnq