尝试做一个无限滚动页面,在用户滚动时显示元素。
所以每次我检测到滚动到达页面末尾时,我调用
this.recordLimit += 10;
this.subscribe('movements', {limit: this.recordLimit});
触发(autorun)
this.autorun(h => {
if (this.ready()) {
this.items = Items.find(<potential limit filter here too>);
}
好吧。这是有效的。但是,每次调用this.items = Items.find();
时,用户的浏览器都会滚动到顶部。
这可能是因为dom元素被删除,滚动被重置,然后再次添加元素而不恢复之前的滚动位置。
明显有效的例子:
- https://github.com/barbatus/ng-infinite-scroll/blob/master/scroll-controller.js
- https://github.com/abecks/meteor-infinite-scroll
- http://meteorpedia.com/read/Infinite_Scrolling
@###########编辑############@
实际上,我注意到,在Items.find()
后面放一个h.stop()
来停止订阅,这是有效的…我猜以前的芒果光标更新了最后的订阅限制。
然而,我仍然不能理解为什么这是重新绘制一切在最初的情况下。
我认为问题是您再次找到了您猜测的文档。您应该只订阅自动运行中的出版物。从Angular2 &流星教程很好地解释了pub/sub。
在自动运行中,它将重新运行find()
并重新呈现所有文档,这就是为什么您只需要在自动运行中为您的情况重新运行订阅。由于发布/订阅和观察者的工作方式,因为您唯一更改的是函数中的"限制",其余部分不变,因此您的发布将只返回新文档,并保留先前返回的文档。客户端的find()
查询将获取从pub/sub返回的文档,当文档数量发生变化时,它不会渲染已经获取的文档。