Использование виртуального свитка в угловом материале 2 Таблица с @угловым /cdk-экспериментальным
У меня в таблице отображается так много строк, я хочу оптимизировать ее производительность. Я нашел решение с помощью технологии Virtual Scroll. Вот пример компонента углового материала CDK Vritual Scroll Viewport с простым div
который я нашел:
<cdk-virtual-scroll-viewport class="list-container lg" [itemSize]="52.5">
<div *cdkVirtualFor="let state of statesObservable | async;" class="list-group-item">
<div class="state">{{state.name}}</div>
<div class="capital">{{state.capital}}</div>
</div>
</cdk-virtual-scroll-viewport>
Тем не менее, я хочу интегрировать его с таблицей углового материала, как показано ниже.
<table mat-table [dataSource]="dataSource">
<ng-container *ngFor="let c of displayedColumns" [matColumnDef]="c">
<th mat-header-cell *matHeaderCellDef>{{getTitle(c)}}</th>
<td mat-cell style="white-space: pre-wrap;" *matCellDef="let element"> {{element[c]}}</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
Мне было интересно, как перенести этот cdk-virtual-scroll-viewport
в mat-table
. В моей таблице отображается до 1000 строк и более 20 столбцов, а при загрузке и прокрутке производительность довольно медленная.
PS: Я знаю, что это можно решить, используя Paginator, но я не хочу этого делать.
Версии
-
"@angular/material": "^6.2.0"
-
@angular/cdk": "^6.2.0"
-
@angular/cdk-experimental": "^6.2.1"
-
"@angular/core": "6.0.3"
-
"@angular/cli": "6.0.7"
Ответы
Ответ 1
Это не то, что в настоящее время существует из коробки. Компонент CdkTable
(или MatTable
) не поддерживает виртуальную прокрутку YET.
Поддержка виртуального прокрутки, запеченная в @angular/cdk
, все еще находится на этом этапе эксперимента - это изменится в версии 7.
Однако, когда эта функция приземляется, следующий шаг будет реализован для таблицы... и я объясню, почему.
cdk-virtual-scroll-viewport
является контейнером для директивы *cdkVirtualFor
, если мы рассмотрим эту директиву (CdkVirtualForOf
), мы можем видеть, что
1) Он реализует CollectionViewer
(код) 2) Он принимает (работает с) экземпляр DataSource
(код)
Имея это в виду, давайте посмотрим на CdkTable
1) Он реализует CollectionViewer
(код) 2) Он принимает (работает с) экземпляр DataSource
(код)
Сходство не случайно, таблица (с некоторыми настройками) может использоваться cdk-virtual-scroll-viewport
как используется cdkVirtualFor
.
Я не уверен, какова будет окончательная реализация, сможет ли разработчик обернуть таблицу извне или таблица установит ее внутренне, но это направление будет.
Если бы я должен был догадаться, я бы сказал, что разработчик выберет, хочет ли он обернуть таблицу виртуальным прокруткой. Это связано с тем, что cdk-virtual-scroll-viewport
не запрашивает cdkVirtualFor
(через ViewChild
), он является пассивным и ждет чего-то, чтобы его прикрепить... что является признаком того, что это считалось пред-ручным...
Вы можете сделать это прямо сейчас, расширив CdkTable
и внеся корректировки самостоятельно, это потребует понимания внутренних элементов таблицы и может занять некоторое время. Я предлагаю немного подождать.
Ответ 2
Это еще не поддерживается. Но некоторые люди пытались сделать некоторые POC. Вот один https://github.com/angular/material2/issues/10122#issuecomment-440442656.
Также в этом выпуске обсуждается виртуальная прокрутка и как работает вышеуказанный POC.