Чтобы продолжить ответ @Turneye. Причина, по которой это происходит, заключается в том, что пагинатор устанавливается после того, как все строки были отрисованы, потому что это то, что вам сообщает хук ngAfterViewInit
.
Сначала он отображает все строки из источника данных, а затем видит: «Эй, я получаю пагинатор, позвольте мне просто удалить все строки (кроме счетчика пейджера)». Очевидно, что это очень медленно для больших наборов данных и / или сложных шаблонов ячеек таблицы.
Вы можете решить эту проблему, используя параметр {static: true}
на вашем @ViewChild
. Это сделает пагинатор доступным внутри хука жизненного цикла ngOnInit
и до того, как будет отрисована какая-либо строка:
Чтобы украсть его код, вы можете изменить его на этот, сохранив при этом быструю таблицу:
readonly dataSource: MatTableDataSource<LocationItem> = new MatTableDataSource();
@ViewChild(MatSort, { static: true }) sort: MatSort;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
ngOnInit() {
this.dataSource.data = [ GetLargeDataSet ];
this.dataSource.sort = this.sort;
this.dataSource.paginator = this.paginator;
}
Имейте в виду, что это не сработает, если ваш mat-paginator
находится внутри структурной директивы, такой как *ngIf
Другая проблема производительности может заключаться в том, что вам нужно объявить функцию trackBy
:
Для повышения производительности в таблице может быть предоставлена функция trackBy, аналогичная функции Angular ngFor trackBy. Это сообщает таблице, как однозначно идентифицировать строки, чтобы отслеживать, как данные изменяются при каждом обновлении.
<table mat-table [dataSource]="dataSource" [trackBy]="myTrackById">
person
Poul Kruijt
schedule
11.05.2020