【发布时间】:2020-11-20 15:56:48
【问题描述】:
目标
显示消息列表并在收到新消息时滚动到底部,即使我在顶部也是如此。即使元素高度不同,我也想完全滚动到底部。
问题
使用虚拟滚动,我必须设置[itemSize] 属性,但对我来说它不是静态值:
- 当一条消息对于一行来说太长时,它会分成多行,因此它的高度会发生变化。
- 我有不同类型的不同高度的消息(例如系统消息)。
另外,我正在使用ng-content 从父级插入一个按钮以加载以前的消息。我看到的是,当_scrollToBottom 被调用时,不是把我带到底部,而是把我带到更高的地方。我怀疑这是因为虚拟滚动中元素的高度不同。
我已经从 Angular 阅读了这个自动调整滚动策略问题:https://github.com/angular/components/issues/10113;,但我不确定这是否能解决我的问题。
欢迎任何关于我能做什么的想法。
测试
代码沙盒:https://codesandbox.io/s/angular-virtual-scroll-biwn6
- 加载消息后,向上滚动。
- 发送消息。 (加载新消息时,虚拟滚动不会滚动到底部,而是会停止更高一点)
- 重复
有错误的视频:https://gofile.io/d/8NG9HD
解决方案
Gourav Garg 给出的解决方案有效。只需执行两次滚动功能即可。
我现在正在这样做:
private _scrollToBottom() {
setTimeout(() => {
this.virtualScrollViewport.scrollTo({
bottom: 0,
behavior: 'auto',
});
}, 0);
setTimeout(() => {
this.virtualScrollViewport.scrollTo({
bottom: 0,
behavior: 'auto',
});
}, 50);
}
我认为它不是很优雅,但效果很好。
【问题讨论】:
-
您使用的是哪个 Angular cdk 版本?
-
@GouravGarg
"@angular/cdk": "^8.2.3"
标签: javascript angular angular-material virtualscroll angular-cdk-virtual-scroll