流星中的附加订阅

时间:2016-03-17 00:46:54

标签: javascript meteor

我有一个用户可以在Feed中查看的帖子列表。默认情况下,您可以查看10个帖子。通过向下滚动,以无页面方式,下载十个帖子,然后是下一个十个,依此类推。滚动一下后,您可能已经加载了150个帖子。这意味着每次我向下滚动另外十个帖子时,我都会订阅帖子集。我可以用

来模拟这个
var limit = 150;
return Posts.find({}, {limit: limit, sort: {timestamp: -1}});

但是,当您这样做时,其他用户也可以发布,这会自动进入您的Feed。如果您在向下滚动时发布了30个新帖子,现在您将看到第180个帖子。

var new = 30;
var limit = 150 + new;
return Posts.find({}, {limit: limit, sort: {timestamp: -1}});

使用这个模型,我会简单地跟踪自我开始滚动以来新帖子的数量,并在新帖子制作时不断重新订阅,并且滚动时,这与不断轮询服务器的帖子和击败目的不同流星的反应性。

我可以从集合中检索新文档而不丢失旧文档有哪些选项?

2 个答案:

答案 0 :(得分:1)

我的解决方案与雅各布类似,但您可以跟踪用户加载页面并将其发送到出版物的时间:

Template.blah.onCreated(function() {
  this.limit = new ReactiveVar(10); // I assume this is getting updated already.
  var loadTime = new Date().getTime();
  this.autorun(function() {
    this.subscribe('mySub', loadTime, this.limit.get());
  });
});

然后在您的服务器上,获取比loadTime更新的项目数,并将它们添加到通过的限制中以获得修改后的限制:

Meteor.publish('mySub', function(time, limit) {
  var countOfItemsNewerThanLoadTime = Posts.find({ timestamp: { $gt: time } }).count();
  return Posts.find({}, {limit: limit + countOfItemsNewerThanLoadTime, sort: {timestamp: -1}});
});

答案 1 :(得分:0)

我提出的最佳解决方案是在滚动时跟踪时间戳,并简单地请求所有比这更新的帖子。只要最近一次喂食,这会给我一个静态订阅以获得我需要的帖子。

var oldestTime = 1234567890;
return Posts.find({timestamp: {$gt: oldestTime}}, {sort: {timestamp: -1}});

此设置的问题在于难以保持无限滚动的工作。一旦我滚动到底部,我会添加多少?十秒钟?一小时?如果帖子以一致的速度进入,我可以回答这个问题,但根据用户的活动,时间确实可能非常不一致。

编辑:在阅读斯蒂芬的帖子后,我想我有解决方案

跟踪用户加载页面的时间,以及他们滚动时应看到的旧帖子的限制。

find: function () { //Posts newer than page load
  var startTime = 1234567890;
  return Posts.find({timestamp: {$lt: startTime}}, {sort: {timestamp: -1}});
},
find: function () { //Posts older than page load
  var startTime = 1234567890;
  var limit = 150;
  Posts.find({timestamp: {$gt: startTime}}, {sort: {timestamp: -1}, limit: limit}); 
}

我认为这里唯一真正的考虑因素是我需要确保我与服务器时间而不是客户端时间进行比较,因为差距可能会超过一两个文档。