无法创建或清除消息警报

时间:2016-05-27 11:20:00

标签: javascript jquery meteor

我有一个未读的消息计数器(数字)。进入聊天室后,未读消息将被标记为已读并且计数器= 0.

现在,click事件正常工作(使用console.log检查),但不知何故,我似乎无法为消息及其警报标记读取或标记未读。

*注意:更新后的答案

roomDetail.js - 用于提交消息+创建提醒

Template.roomDetail.events({
  'submit form': function(template) {
      var message = template.find('input').value;  
      var roomId = this._id; 
      Messages.insert({           
         roomId    : Router.current().params._id, //changed from roomId
         msg       : message,
         submitted : new Date().getTime()
      });
      template.find('input').value = '';
      createMessageAlert(messageId, roomId, message); //changed this
   }
});

allRooms.js - 点击进入房间

Template.allRooms.events({
   'click .enterRoom': function() {
      Meteor.call("markAlertsAsRead", { roomId: this._id }); 
   }
});

集合

//shifted all to alerts.js collection file
Messages = new Mongo.Collection("messages");
   createMessageAlert = function(messageId, roomId, message){
      if (message) {
         if ( message.user !== Meteor.userId() ){     
            Alerts.insert({
               roomId        : Router.current().params._id, //roomId doesnt work, messages get logged but do not appear
               messageId     : messageId,  //message._id,
               read          : false
            });
         }
      }
   };

Meteor.methods({
   markAlertsAsRead: function(roomId, options){
      Alerts.update({ roomId: options.roomId }, {$set:{ read:true }},{ multi:true }); //says options is undefined
   } 
});

1 个答案:

答案 0 :(得分:1)

我认为您没有找到要更新的警报,因为您在更新中选择了错误的ID。您现在正在寻找一个警报,其中一个房间正在向房间发送。

Template.allRooms.events({
   //'click a': function() {
   'click .enterRoom': function() {

      Alerts.update(this._id, { $set: {read: true}} );//<--- first argument is the selector (should be an Alert id)
      console.log("you clicked .enterRoom");
   }
});

我认为应该是这样的。查找具有等于当前Id的roomId的警报。

Template.allRooms.events({
   //'click a': function() {
   'click .enterRoom': function() {

      Alerts.update({roomId: this._id}, { $set: {read: true}} );//<--- now assuming this._id is a roomId
      console.log("you clicked .enterRoom");
   }
});

更新

当你复制一些代码时,我注意到了一些&#34;不安全&#34;错误。显然,您无法再从客户端进行上述更新,因此您必须调用服务器方法(或循环遍历所有警报以查找其_id)。

我在下面调用服务器方法(来自客户端)

Template.allRooms.events({
   //'click a': function() {
   'click .enterRoom': function() {

      Meteor.call("markAlertsAsRead", {roomId:this._id});//<-- Call a server function
      console.log("you clicked .enterRoom");
   }
});

然后在服务器中你可以使用这样的方法

Meteor.methods({ 
  markAlertsAsRead:function(options){ 
     Alerts.update({roomId:options.roomId}, {$set:{
       read:true
     }},{multi:true});//<-- Multi to update all that match the selector

  } 
});

另请注意选项。这是必需的,因为它只会更新选择器的第一个匹配。

更新2

更新了createmessagealert函数和roomdetail事件处理程序

Template.roomDetail.events({
  'submit form': function(event, template) {
      event.preventDefault();
      var message = template.find('input').value;
      var roomId = this._id;

      var messageId = Messages.insert({
         roomId    : roomId,
         msg       : message,
         submitted : new Date().getTime()
      });
      template.find('input').value = '';
      createMessageAlert(messageId, roomId, message);
   }
});


createMessageAlert = function(messageId, roomId, message){
  Alerts.insert({
     roomId        : roomId,
     messageId     : messageId,
     read          : false
  });
};

由于您已经手动调用createMessageAlert,因此无需观察为消息集合添加的内容。