Meteor reactive发布/订阅

时间:2014-08-01 18:39:59

标签: meteor publish-subscribe

我目前正在制作流星中的聊天应用。首次进入房间时,您最初会收到25条消息。现在,当新消息进入页面时,该值应相应增加。

现在我到目前为止,我尝试了几种不同的东西,都没有达到预期的效果。

我已经尝试在客户端设置一个会话变量,当消息计数增加时,它会反应性地重新订阅给定的发布。此路由的问题是,当新消息进入时,由于订阅,页面上的所有消息都需要重新加载,因此会产生负面影响。

我最近尝试使用reactive-publish软件包,运气不佳,因为软件包有各种各样的不利影响。

解决此类问题的最佳方法是什么?我希望有一个解决方案,我可以设置某种类型的发布,它只是基于我在数据库中为每个用户的数值流式传输消息。

编辑:添加上下文

我在想

Meteor.publish 'messages', (roomId) ->
    dl = // Some value that I pull from the database, which gets updated as new messages come into a room

    Messages.find({room: roomId, type: "user_message"}, {sort: {time: -1}, limit: dl, fields: {_id: 1, name: 1, message: 1, room: 1, time: 1, type: 1}})

2 个答案:

答案 0 :(得分:1)

通过使用低级别的出版物API,可以实现Pub / Sub灵活性的巨大灵活性 - 以至于我只是写了a blog post。当新文档出现在查询集中时,它应该非常清楚地更新变量。

答案 1 :(得分:0)

您似乎希望每个用户根据他们进入聊天室的时间(即Meteor.subscribe("messages", roomId, new Date))拥有唯一的订阅,其中包含来自他们进入会议室之前的最多25条消息。这是一个选项:

Meteor.publish("messages", function (roomId, time) {
  var lastRecent = _.last(Messages.find({
    room: roomId, type: "user_message"
  }, {sort: {time: -1}, limit: 25}).fetch());

  var cutoffTime = lastRecent && lastRecent.time || time;

  return Messages.find({
    room: roomId, type: "user_message", time: {$gt: cutoffTime}
  });
});

如果您想连续添加例如当用户滚动到聊天窗口的顶部时,每次有25条旧消息,考虑到您实际上可能不需要"订阅"那些旧的消息。您可以设置类似Meteor.call("getNOlderMessages", {roomId: roomId, N: 25, priorTo: oldestShownTime})的方法调用来获取它们,将它们插入到客户端上的本地集合中(例如OlderMessages = new Meteor.Collection(null);),然后执行以下操作:

<template="messages">
  {{#each olderMessages}} {{> message}} {{/each}}
  {{#each messages}} {{> message}} {{/each}}
</template>