1

チャットメッセージは次のように表示されます。

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

ユーザーがチャットに入ると、。を使用してコレクションにドキュメントを追加しますuser joins the chat。ユーザーがすぐに再入してチャットを離れるとき、私は何度も何度も複製したくありませんuser joins the chat。のようなものを表示したいuser joins the chat x3

renderListにフックすることでクライアント側でこれを行う方法はありますか?サーバー側でドキュメントを変更できることはわかっていますが、不必要に集中的になっているようです。

4

2 に答える 2

1

ここからそこに到達する最も簡単な方法は、カスタムパブリッシャーを作成することです。公開関数からカーソルを返すだけでなく、公開関数内でカーソルに対してobserve()を呼び出し、その中で適切なset()、unset()、flush()呼び出しを実行して、前の値を適切に乗算します。新しいメッセージを追加する代わりにメッセージ。関連するドキュメントは、Meteor.publishのmeteorドキュメントにあります。

比較の基礎を得るには、現在のコードを調べて、packers / mongo-livedata/mongo_driver.jsにあるCursorをCursor.prototype._publishCursorに公開します。

注:ここでの私の答えは、Meteor0.5.2に対するものです。カスタムパブリッシャーのAPIは、Meteorの将来のリリースで変更される予定であり、set()unset()およびflush()とは異なる関数を呼び出す必要があります。

于 2012-12-14T02:05:17.107 に答える
0

1つのオプションは、最新のユーザー参加メッセージを更新するだけのメソッド呼び出しを行うことです。

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);
  },[]);
}

これはちょっとおかしなことです。チャットの現在のメッセージで見つかったすべての参加メッセージを1つのメッセージに「削減」すると言えば十分です。プロパティを動的に追加しますtimesJoined; ドキュメントには表示されません。ただしtype、参加メッセージと通常のメッセージの違いを知らせるフィールドが必要です。

少なくともそのメタデータがない場合、チャットアプリケーションはうまく機能しません。モデルを変更することを躊躇しないでください!

于 2012-12-17T09:19:33.553 に答える