我已经通过使用@ContentChildren实现了一个解决方案装饰器某种程度上类似于的答案。
根据docs,此装饰器:
从内容DOM获取元素或指令的QueryList。每当添加,删除或移动子元素时,查询列表都将更新,并且查询列表的可观察到的更改将发出新值。
因此,父组件中的必要代码将是:
<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