В ngAfterViewInit()
я вызываю асинхронный метод (пробовал с и без await
) для инициализации таблицы собраний:
public async getMeetings() {
this.pendingOperation = false;
try {
var { meetingsUrl, bearerToken } = await this.getMeetingsUrl();
var authAndJsonContentHeaderOption = {
headers: {
"Authorization": `Bearer ${bearerToken}`,
"Content-Type": "application/json"
}
};
var httpResult = await this.http.get<any>(meetingsUrl, authAndJsonContentHeaderOption).toPromise();
this.meetings = new Array();
httpResult._embedded.myOnlineMeeting.forEach(element => {
this.meetings.push(element);
});
this.pagedMeetings = this.meetings.slice(0, this.pageSize);
setTimeout(() => {
this.observablePagedMeetings.next(this.pagedMeetings);
}, 100);
}
catch (ex) {
this.errors = `Error: ${ex.message}`;
console.log(`Error: ${ex.message}`);
}
this.pendingOperation = false;
}
Как видно из кода выше, найденный списоксобраний отправляется на Subject
, так что представление может отображать его в разбивке на страницы материала.
ngAfterViewInit()
довольно просто:
ngAfterViewInit() {
this.filteredUsers.subscribe((filteredUsers) => {
this.displayedUsers = filteredUsers;
});
this.matAutocomplete._keyManager.change.subscribe((index) => {
if (index >= 0) {
this.selectedUser = index;
}
});
this.getMeetings();
}
HTML это:
<table mat-table *ngIf="pagedMeetings" [dataSource]="observablePagedMeetings" style="width: 100%">
<!-- table markup -->
</table>
Проблема в том, что этот getMeetings()
вызывается несколько раз, а не один раз.
До сих пор я пытался:
- , используя setTimeout, чтобы отложить этот вызов
- указание ChangeDetectionStrategy.OnPush для этого компонента (как предложено здесь ) для выхода из возможного цикла обнаружения изменений.
Редактировать:
- Действительно,
ngAfterViewInit()
сам вызывается несколько раз