2016-05-04 14 views
0

私は、ユーザに属するすべての未読メッセージをチェックする方法を持っています。アプリが読み込まれると、この番号が[メッセージ]ドロップダウンの横に表示されます。メテオでは、新しいメッセージが来たときや読んでいないメッセージを読んだときに、この数や変数をどのように更新すればよいですか?私は、アプリケーション自体を更新せずにメッセージの状態が変わるたびに、新しいカウントを送信する方法が必要です。Meteor/MongoDBがデータを反応的にプル

私はTracker.autorun機能に精通していますが、この状況では役に立たないと思います。これに近づくためのベストプラクティスは何ですか?

答えて

0

Publish/Subscribeを使用してください。常に反応する。未読のメッセージをすぐにクライアントに送信してカウントさせたくない場合は、未読メッセージの数をカウントしてカウントするカスタムコレクションを作成します。これはまさにあなたのユースケースである

// server: publish the current size of a collection

で始まるリンクされたページにビットダウンの例を見てください。

0

私はこの新しいメッセージの設定を正確にしています。デビッド・ウェルドンはまっすぐ私を設定する前に、私は返すようにヘルパーを持っていた昔

Template.header.helpers({ 
    Messages: function(){ return Messages.find(); } 
}); 

<li>Messages <span class="counter">{{Messages.count}}</span></li> 

をそして私は、カーソルを返すヘルパーを持っている:私のヘッダーでは私が持っていますカウント、今私はちょうど直接火災のHTMLテンプレートでカウントを参照してください。

このアプローチでは、Messagesコレクションに加入しているので、新しいメッセージがクライアントに送信され、ローカルで数えられるようになります。これはすぐに読まれることを前提としています。この手順を避けたい場合は、Statsコレクションを公開するか、ユーザーオブジェクトに統計キーを含めてカウントだけをpub-sub経由で同期できるようにする必要があります。

0

あなただけの読み取りのようなフィールドを持っている、とのように更新することができます読み取りとして一つのメッセージをマーキングするための

方法:

markRead: function(messageId){ 
    Messages.update(messageId, { 
     $set: { 
      read: true //this needs to be set to false when its inserted 
     } 
    }) 
} 

一括更新方法(すべてのメッセージをreceiverIdが保存されていると仮定した場合):

markAllRead: function(){ 
    Messages.update({receiver: Meteor.userId(), read:false}, { 
     $set: { 
      read: true 
     } 
    }, {multi: true}) 
} 

あなたは、カウントを取得するためにread:falseものを数えることができますし、

何かを記述する必要はありません

ヘルパー:

count: function(){ 
    //even if your publish/subscribe is correct, the count we want is from messages that are not read and the receiver is current user. 
    return Messages.find({receiver: Meteor.userId(), read: false }).count(); 
} 

イベント:

'click .elementClass': function(){ 
    //both users see the messages and they can both click. We want to update the right message for the right user. Otherwise, the other user can mark the message as read when the receiver is the other user which they shouldn't be able to do. You can do a simple check on the client side, and another check in the method if necessary. 
    if(this.receiver === Meteor.userId()){ 
     Meteor.call('markAsRead', this._id) 
    } 
} 

それはあなたの問題/解答のすべてのご質問を解決するかどうか私に教えてください。

関連する問題