我的聊天消息显示如下:
{{#each msg}}
{{> chatMsg}}
{{/each}}
当用户进入聊天时,我使用user joins the chat
将文档添加到集合中。当用户快速重新进入并离开聊天时,我不想一遍又一遍地复制user joins the chat
。我希望显示user joins the chat x3
。
有没有办法通过挂钩到renderList在客户端执行此操作?我知道我可以在服务器端更改文档,但它似乎不必要地密集。
答案 0 :(得分:1)
从这里到达目的地最简单的方法是编写自定义发布者。不要只是从发布函数返回一个游标,而是在发布函数中调用游标上的observe(),并在其中执行相应的set(),unset()和flush()调用,这样做会使前一个函数相乘消息而不是添加新消息。您可以在meteor documentation for Meteor.publish
找到相关文档要从比较中获得基础,您可以查看当前代码以在Cursor.prototype._publishCursor中发布Cursor,它位于packages / mongo-livedata / mongo_driver.js中。
注意:我的答案是Meteor 0.5.2。自定义发布者的API将在未来的Meteor版本中发生变化,并且您必须调用的函数不同于set()unset()和flush()
答案 1 :(得分:0)
一种选择是进行方法调用,只更新最新用户加入的消息。
function formatJoinMessage(username,count) {...}
if (Meteor.isServer) Meteor.startup(function () {Chats._ensureIndex({modified:-1}); ...});
Meteor.methods({
join:function() {
var joinMessage = Chats.find({type:MESSAGE_TYPE_JOINED,userId:this.userId}).sort({modified:-1}).fetch()[0];
if (joinMessage)
Chats.update({_id:joinMessage._id},{$inc:{joins:1},$set:{text:formatJoinMessage(this.userId,joinMessage.joins+1),modified:new Date()});
else
Chats.insert({user:this.userId,joins:1,modified:new Date(),text:formatJoinMessage(this.userId,1)});
}
)};
不想更改服务器文档?没关系,但概念上聊天加入不是聊天消息。因此,您应该在meta
文档中为此类内容添加chat
字段。
但假设你不想这样做。我会做这样的事情:
var userIdToName = function(userId) {...}; // some kind of userId to name helper
Template.chatroom.msg = function() {
var messages = Chat.findOne(Session.get("currentChat")).messages; // msg in your code?
return _.reduce(messages,function (newMessages, currentMessage) {
var lastMsg = newMessages[newMessages.length-1];
if (currentMessage.type == MESSAGE_TYPES_JOIN) {
if (lastMsg && lastMsg.type == MESSAGE_TYPES_JOIN && currentMessage.user == lastMsg.user) {
currentMessage.timesJoined = lastMsg.timesJoined+1;
newMessages.shift();
} else {
currentMessage.timesJoined = 1;
}
currentMessage.chatMsg = userIdToName(lastMsg.user) + " joins the chat &mult;" + currentMessage.timesJoined.toString();
}
return newMessages.concat(currentMessage);
},[]);
}
这有点儿麻烦。可以这么说,它将聊天当前消息中找到的所有加入消息“减少”到一条消息。您动态添加属性timesJoined
;它没有出现在文件中。但是你应该有一个type
字段,让你知道加入消息和常规消息之间的区别。
如果您至少没有这些元数据,那么您的聊天应用程序将无法正常运行。不要犹豫,改变你的模型!