Если свойство allChildrenLoaded
указывает, что дочерние элементы загружены, вы можете привязать его к свойству hidden
основного div. В отличие от ngIf
, который загружает элемент только при выполнении условия, свойство hidden
скрывает элемент, который фактически присутствует в DOM.
<div class="wrapper" [hidden]="!allChildrenLoaded">
<child1></child1>
<child2 *ngFor="let value of values"></child2>
<trip-list (loaded)="onTripListLoaded()"></trip-list>
</div>
<Ч />
Вы можете использовать @ViewChildren
и событие changes
QueryList
, чтобы определить, когда загружены компоненты:
export class ParentComponent implements AfterViewInit {
@ViewChildren(Child1Component) children1: QueryList<Child1Component>;
@ViewChildren(Child2Component) children2: QueryList<Child2Component>;
private child1Loaded = false;
private children2Loaded = false;
private tripListLoaded = false;
private expectedChildren2Count = 5; // Expected number of Child2Component to be loaded
constructor(private cd: ChangeDetectorRef) { }
ngAfterViewInit() {
this.child1Loaded = this.children1.length > 0;
this.children2Loaded = this.children2.length === expectedChildren2Count;
this.cd.detectChanges(); // To avoid possible runtime error
this.children1.changes.subscribe(() => {
this.child1Loaded = this.children1.length > 0;
});
this.children2.changes.subscribe(() => {
this.children2Loaded = this.children2.length === expectedChildren2Count;
});
}
onTripListLoaded() {
this.tripListLoaded = true;
}
get allChildrenLoaded(): boolean {
return this.child1Loaded && this.child2Loaded && this.tripListLoaded;
}
}
<Ч />
В компоненте trip-list
вы можете генерировать событие loaded
при загрузке содержимого. Для обработки этого события родительский компонент использует привязку события (см. Разметку выше).
@Output() public loaded: EventEmitter<any> = new EventEmitter();
getTrips() {
this.fundService.getTrips().subscribe(
data => {
this.trips= data;
this.loaded.emit();
},
err => console.error(err),
() => console.log(this.trips)
);
}
<Ч />
См. Демоверсию этого стека .