我目前正在制作流星中的聊天应用。首次进入房间时,您最初会收到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}})
答案 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>