流星渲染列表拦截?客户端

时间:2012-12-01 21:09:46

标签: javascript meteor

我的聊天消息显示如下:

  {{#each msg}}
    {{> chatMsg}}
  {{/each}}

当用户进入聊天时,我使用user joins the chat将文档添加到集合中。当用户快速重新进入并离开聊天时,我不想一遍又一遍地复制user joins the chat。我希望显示user joins the chat x3

之类的内容

有没有办法通过挂钩到renderList在客户端执行此操作?我知道我可以在服务器端更改文档,但它似乎不必要地密集。

2 个答案:

答案 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字段,让你知道加入消息和常规消息之间的区别。

如果您至少没有这些元数据,那么您的聊天应用程序将无法正常运行。不要犹豫,改变你的模型!