我有一个未读的消息计数器(数字)。进入聊天室后,未读消息将被标记为已读并且计数器= 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
}
});
答案 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
}
});
另请注意多选项。这是必需的,因为它只会更新选择器的第一个匹配。
更新了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,因此无需观察为消息集合添加的内容。