【发布时间】:2021-02-16 07:56:36
【问题描述】:
使用 CDK 自动调整虚拟滚动策略保持滚动位置
我有一个很大的项目列表,可以使用 @angular/cdk-experimental 提供的 <cdk-virtual-scroll-viewport autosize> 滚动(这些项目具有动态高度,因此我使用此滚动策略而不是 FixedSizeVirtualScrollStrategy)。
随着时间的推移,新项目被插入到列表中,即它们被附加在顶部。当用户向下滚动时,我想避免新项目将视口中的项目推开。因此,我需要一种机制来在添加项目后维持/恢复滚动位置。
我有一个半工作的解决方案(而且很麻烦,因为它读取私有字段),但是在添加项目后视口会随机移动几个像素。
以下是相关代码部分:
@ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;
...
// After new items have been added:
const offset = this.viewport.measureScrollOffset('top');
const topPosition = offset + newItems.length * this.viewport['_scrollStrategy']._averager._averageItemSize; // the autosize strategy determines an average item size I'm trying to use to determine how the viewport should be shifted
this.viewport.scrollTo({
top: topPosition
});
我在这里创建了这种方法的演示:https://stackblitz.com/edit/angular-be926g?file=src/app/cdk-virtual-scroll-overview-example.ts
任何想法如何通过恒定视口无缝实现这一目标?
【问题讨论】:
-
您可以考虑将新数据存储在另一个属性中,并在滚动窗口顶部有一个通知,当收到新数据时,用户决定是否需要加载新数据
标签: angular angular-material angular-cdk angular-cdk-virtual-scroll