我目前正在制作流星聊天应用程序。当你第一次进入房间时,你一开始会收到25条信息。现在,当新消息进入页面时,该值应该相应增加。
到目前为止,我已经尝试了一些不同的事情,都没有给出预期的结果。
我已经尝试在客户端设置一个会话变量,当消息计数增加时,该会话变量会响应性地重新订阅给定的发布。此路由的问题是,当新消息传入时,由于订阅,页面上的所有消息都需要重新加载,这会产生不利影响。
我最近尝试使用reactive-publish
包,运气不好,因为这个包有它自己的一些不利影响。
解决这类问题的最好方法是什么?我希望有一个解决方案,在那里我可以建立某种类型的发布,只是在消息流基于一个数值,我在数据库中为每个用户。
EDIT:添加上下文
我在想类似
的东西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}})
通过使用低级发布API,可以实现发布/订阅灵活性的巨大灵活性-如此之多以至于我刚刚写了一篇关于它的博客文章。当查询集中出现新文档时,应该非常清楚如何更新变量。
似乎您希望每个用户都有一个基于他们进入聊天室的时间的唯一订阅,即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>