Tôi đã triển khai một giải pháp bằng cách sử dụng @ContentChildren decorator, bằng cách nào đó tương tự như câu trả lời của @ Lerner.
Theo tài liệu , người trang trí này:
Nhận QueryList của các phần tử hoặc chỉ thị từ DOM nội dung. Bất kỳ khi nào một phần tử con được thêm, xóa hoặc di chuyển, danh sách truy vấn sẽ được cập nhật và những thay đổi có thể quan sát được của danh sách truy vấn sẽ tạo ra một giá trị mới.
Vì vậy, mã cần thiết trong thành phần mẹ sẽ là:
<app-my-component>
<div #myComponentContent>
This is my component content
</div>
</app-my-component>
Trong lớp thành phần:
@ContentChildren('myComponentContent') content: QueryList<ElementRef>;
Sau đó, trong mẫu thành phần:
<div class="container">
<ng-content></ng-content>
<span *ngIf="*ngIf="!content.length""><em>Display this if ng-content is empty!</em></span>
</div>
Ví dụ đầy đủ : https://stackblitz.com/edit/angular-jjjdqb
Tôi đã tìm thấy giải pháp này được triển khai trong các thành phần góc cạnh matSuffix
, trong trường biểu mẫu thành phần .
Trong trường hợp nội dung của thành phần được đưa vào sau này, sau khi ứng dụng được khởi chạy, chúng tôi cũng có thể sử dụng triển khai phản ứng, bằng cách đăng ký changes
sự kiện của 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();
}
}
Ví dụ đầy đủ : https://stackblitz.com/edit/angular-essvnq