angular - Angular CDK 虚拟滚动不会一次选择 matselect 中的所有列大型数据集
问题描述
我有一个像这样带有虚拟滚动的角度的垫选择。
<mat-select [formControl]="multiSelectControl" multiple [value]="selected" (openedChange)="openChange($event)">
<cdk-virtual-scroll-viewport itemSize="5" minBufferPx="200" maxBufferPx="400" [style.height.px]=5*48>
<button (click)="selectAll()">Select All</button>
<button (click)="clear()">Clear</button>
<mat-option *cdkVirtualFor="let topping of toppingList" [value]="topping" (onSelectionChange)="onSelectionChange($event)">{{topping}}</mat-option>
</cdk-virtual-scroll-viewport>
</mat-select>
.ts 文件:
@ViewChildren(MatOption)
options: QueryList<MatOption>;
constructor(private cd: ChangeDetectorRef) {}
ngAfterViewInit(): void {
this.options.changes.subscribe(() => {
let needUpdate = false;
this.options.forEach((option) => {
const selected = this.selected.includes(option.value);
if (selected && !option.selected) {
option.select();
needUpdate = true;
} else if (!selected && option.selected) {
option.deselect();
needUpdate = true;
}
});
if (needUpdate) {
this.cd.detectChanges();
}
});
}
onSelectionChange(change): void {
if (!change.isUserInput) {
return;
}
const value = change.source.value;
const idx = this.selected.indexOf(change.source.value);
if (idx > -1) {
this.selected.splice(idx, 1)
} else {
this.selected.push(value);
}
}
带有stackblitz链接。
如果我单击全选并更快地滚动,则所有元素都不会被选中,就像它们需要时间才能被选中一样。有什么方法可以提高性能。
解决方案
一个选项是收听滚动Observable
的ScrollDispatcher
:
ngAfterViewInit(): void {
this.sd.scrolled().pipe(
filter((scrollable) => this.cdkVirtualScrollViewPort === scrollable)
).subscribe(() => {
let needUpdate = false;
this.options.forEach((option) => {
const selected = this.selected.includes(option.value);
if (selected && !option.selected) {
option.select();
needUpdate = true;
} else if (!selected && option.selected) {
option.deselect();
needUpdate = true;
}
});
if (needUpdate) {
this.cd.detectChanges();
}
});
}
你可能会去抖动事件,这样它就不会被触发太多。我已经用这个解决方案更新了 stackblitz
推荐阅读
- c++ - 如何创建variate_generator的向量?
- android - 无法打开活动:无法创建 Android 视图模型的实例
- angular - 我错过了什么我的 RXJS 服务不返回数组?
- ios - 如何从 Health 应用程序访问和读取步行事件?
- codeigniter-3 - 文件上传时数组到字符串转换错误,显示错误但没有成功数据
- classnotfoundexception - ClassNotFound 与 Ozzie、Azure HDInsight 和 Spark2
- python - Pandas - groupby,其中每一行都有多个值存储在列表中
- asynchronous - 离子异步 ngFor 数据
- javascript - Electron webview 不会自动播放 youtube 视频
- wordpress - 正则表达式重定向 301 文件夹和 Wordpress 中该文件夹中的所有帖子