Angular2 Meteor,实现无限滚动时出现问题(滚动重置到顶部)

4
尝试制作一个无限滚动页面,当用户滚动时,元素会被展示出来。
因此,每当我检测到滚动条到达页面底部时,我会调用:
this.recordLimit += 10;
this.subscribe('movements', {limit: this.recordLimit});

并且这会触发(自动运行)

        this.autorun(h => {
            if (this.ready()) {
                this.items = Items.find(<potential limit filter here too>);
            }

好的。这可以正常工作。但是每次调用 this.items = Items.find(); 后,用户的浏览器都会滚动回顶部。可能的原因是因为 DOM 元素被删除,滚动位置被重置,然后再次添加元素而没有恢复以前的滚动位置。 我做错了什么? “显然”运行良好的示例: @########### 编辑 ############@
实际上,我注意到在 Items.find() 之后放置一个 h.stop() 来停止订阅,这样就可以正常工作了...我猜以前的 mango 游标使用了最后一次订阅限制进行了更新。然而,我仍然无法理解为什么在初始情况下会重绘所有内容...
1个回答

1
我认为问题在于你再次查找文档,正如你所猜测的那样。你应该只在autorun中订阅你的出版物。请参考Angular2&Meteor教程中的this,它很好地解释了发布/订阅。
在autorun中,它将重新运行find()并重新呈现所有文档,这就是为什么你只需要在autorun中重新运行订阅的原因。由于发布/订阅和观察器的工作方式,因为您只更改函数中的“limit”,其余部分都相同,因此您的发布将仅返回新文档,并保留先前返回的文档。客户端上的find()查询将获取从发布/订阅返回的文档,并且当文档数量更改时,它不会重新呈现已获取的文档。

我不理解“你应该只订阅自己的出版物”,更确切地说,“应该”和“只”。在自动运行中订阅如何成为良好实践或必需? - ATX
@ATX 这是因为观察者的工作方式。假设您返回了20个文档,然后使用滚动条将限制更改为40,如果您在autorun中订阅并返回文档而不是在autorun中,则不会重新呈现先前获取的20个文档。我对按钮点击或无限滚动也有相同的功能。 - Luna
更明确地说,subscribe将文档返回给客户端,而不是返回到应用程序中的特定位置,但使它们在客户端中可用。因此,由于更改了限制,您需要自动运行subscribe。然后,publish获取查询,并且由于唯一的更改是限制,它会返回XX个文档。由于在更改限制之前已经有xx个文档,并且您没有在autorun中返回它们,因此它按照应该的方式运行,这也是为什么它是“正确”的做法。 - Luna
我将标记您的答案。但请注意,使用ng release版本(带有rxjs)时,我的解决方案是使用响应式变量来限制变量,并将 两个 sub 和 find 放在同一个 autorun 中。那时就可以达到预期结果。 - ATX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接