Meteor reactive发布/订阅

Meteor reactive发布/订阅,meteor,publish-subscribe,Meteor,Publish Subscribe,我目前正在开发meteor中的聊天应用程序。当你第一次进入房间时,最初会收到25条信息。现在,当新消息进入页面时,该值应相应增加 现在我已经尝试了两种不同的方法,但都没有达到预期的效果 我曾尝试在客户端设置一个会话变量,当消息计数增加时,该变量会反应性地重新订阅给定的发布。此路由的问题是,当新消息传入时,由于订阅的原因,页面上的所有消息都需要重新加载,这会产生不利影响 我最近尝试使用反应式发布包,但运气不佳,因为该包本身有一些不利影响 解决这类问题的最佳方法是什么?我希望有一个解决方案,我可以设

我目前正在开发meteor中的聊天应用程序。当你第一次进入房间时,最初会收到25条信息。现在,当新消息进入页面时,该值应相应增加

现在我已经尝试了两种不同的方法,但都没有达到预期的效果

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

我最近尝试使用
反应式发布
包,但运气不佳,因为该包本身有一些不利影响

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

编辑:添加上下文

我在想一些类似的事情

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}})

您似乎希望每个用户根据进入聊天室的时间拥有一个唯一的订阅,即
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(“getnoldemessages”,{roomId:roomId,N:25,priorTo:oldestShownTime})
要获取它们,将它们插入客户端的本地集合(例如
OlderMessages=new Meteor.collection(null);
),然后执行以下操作:

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

{{{#每个旧消息}{{>message}{{/each}}
{{{{}每条消息}{{>message}{{{/each}}

发布/订阅灵活性的巨大灵活性可以通过使用低级发布API来实现,这一点我已经写过了。当查询集中出现新文档时,您应该清楚地知道如何更新变量。

因此,当订阅被激活时,您需要最多25条过去的消息,以及此后的所有新消息?我需要该房间中最近的25条消息,而且比后面的任何消息都要多。按
时间排序:-1
已经从本质上处理了时间。我想要的更多的是一个发布,它会随着dl变量的更新而更新。我希望限制变量为动态的原因是,我还设置了一个系统,如果用户滚动到聊天框的顶部,我会向发布添加额外的25条消息。@Donny乍一看,这看起来不错,但是您不需要在最后一个游标中进行排序。@David right,您不需要在最后一个游标中进行排序,而且它也没用,因为用户无论如何都需要在客户端上重新排序。@SeanCallahan您应该将时间作为一个显式参数传递给发布函数,除非您同意进入聊天室的人与一小时前进入聊天室的人发送完全相同的一组消息——Meteor在以下情况下让客户端共享发布实例:可能(当
subscribe
的参数相同时)。