2016-05-04 2 views
0

У меня есть метод, который проверяет все непрочитанные сообщения, принадлежащие пользователю. Когда приложение загружается, этот номер появляется рядом с раскрытием «Сообщения». В Meteor, как я могу обновить этот счет или переменную, когда приходит новое сообщение или когда пользователь читает непрочитанное сообщение? В значительной степени мне нужен метод для отправки нового счета в любое время, когда состояние сообщения изменяется без обновления самого приложения.Meteor/MongoDB извлекает данные реактивно

Я знаком с функциональностью Tracker.autorun, но я не думаю, что это поможет в этой ситуации. Какова наилучшая практика для этого?

ответ

0

Использование Publish/Subscribe. Он всегда реактивен. Если вы не хотите, чтобы все непрочитанные сообщения были отправлены клиенту сразу и подсчитаны там, вы создаете собственную коллекцию, которая подсчитывает количество непрочитанных сообщений и публикует этот счет. Посмотрите на пример немного вниз связанной страницы, которая начинается с

// server: publish the current size of a collection

Это именно ваш случай использования.

0

У меня есть именно эта настройка для новых сообщений. В моем заголовке у меня есть:

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

А то у меня есть помощник, который возвращает курсор:

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

В старые времена, до Дэвид Уэлдон поставил меня прямо, я имел обыкновение иметь помощника, чтобы вернуться count, теперь я просто ссылаюсь на счет непосредственно в шаблоне blaze 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 те, чтобы получить счет и вы не должны писать что-нибудь еще

Helper:

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) 
    } 
} 

Позвольте мне знать, если он решает свои проблемы/ответы на все ваши вопросы.