Meteor / MongoDB反应性地提取数据

时间:2016-05-04 14:44:58

标签: meteor

我有一种方法可以检查属于用户的所有未读消息。当应用加载时,此数字会显示在“消息”下拉旁边。在Meteor中,如何在新消息进入或用户读取未读消息时更新此计数或变量?我几乎需要这种方法,只要消息状态发生变化,就可以在不刷新应用程序本身的情况下发送新计数。

我熟悉Tracker.autorun功能,但我认为这对这种情况没有帮助。接近这个的最佳做法是什么?

3 个答案:

答案 0 :(得分:0)

使用Publish/Subscribe。它总是被动的。如果您不希望将所有未读消息直接发送到客户端并在那里计数,那么您将创建一个自定义集合,该集合只计算未读消息的数量并发布该计数。在以

开头的链接页面中查看示例

// server: publish the current size of a collection

这正是您的使用案例。

答案 1 :(得分:0)

我对新邮件有这种设置。在我的标题中,我有:

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

然后我有一个帮助器返回光标:

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

在过去,在大卫·韦尔登让我直截了当之前,我曾经有一个助手来返回计数,现在我只是直接在火焰html模板中引用计数。

现在,在这种方法中,我订阅了Messages集合,以便将新消息传输到客户端,然后可以在本地计算。这是基于他们即将被阅读的假设。如果你想避免这一步骤,你应该发布一个Stats集合或在用户对象中包含一个统计数据键,这样只需通过pub-sub同步计数本身。

答案 2 :(得分: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)
    }
}

让我知道它是否能解决您的问题/解答您的所有问题。