gpt4 book ai didi

javascript - Meteor 应用程序上的警报/通知不会出现

转载 作者:行者123 更新时间:2023-12-03 06:57:39 25 4
gpt4 key购买 nike

我创建了一个新的“警报”集合。它显示未读消息的数量。消息已提交并显示,并且控制台或服务器上没有其他错误。

第二个问题是,当我单击特定房间时,它应该将所有新消息标记为“已读”。不知何故,这个数字仍然存在。错误显示Exception in queued task: .added@http://localhost:3000/app/lib/collections/messages.js

文件结构:

  • roomList.js - 显示所有房间的列表,显示未读消息的数量
  • roomDetail.js - 当点击列表中的特定房间时,会将消息标记为
    “已读”,未读数消失。
  • alerts.js(警报集合)
  • messages.js(消息集合)
  • rooms.js(房间集合)

出版物和子js

Meteor.publish('alerts', function() {
return Alerts.find({ userId: this.userId, read: false });
});
Meteor.subscribe('alerts')

警报集合js

Alerts = new Mongo.Collection('alerts');
Alerts.allow({
update: ownsDocument,

//if removed, shows error:
// insert failed: Access denied. No allow validators set on restricted collection for method 'insert'.
insert: function(){
return true;
}
});

createMessageAlert = function(message) {
if ( message.user !== Meteor.userId() ){
Alerts.insert({
userId : message.user,
roomId : Router.current().params._id, //params id of current room
messageId : message._id,
read : false
});
}
};

roomDetail.js

  Messages.insert({          
roomId : Router.current().params._id,
msg : message,
user : Meteor.user()._id
});
template.find('input').value = '';
createMessageAlert(message);

roomsList.js

Template.list.helpers({
alerts: function (){
return Alerts.find({ userId: Meteor.userId(), read: false });
},
alertCount: function(){
return Alerts.find({ userId: Meteor.userId(), read: false }).count();
}
});

Template.allRooms.events({
'click a': function() { //click the a href to go into roomDetail
Alerts.update(this._id, {$set: {read: true}});
}
});

最佳答案

最终解决方案:

消息集合中添加新消息时,您应该从触发器调用createMessageAlert

先决条件:

  1. 为消息集合创建一个触发器(MSG_OBSERVER),每当将任何内容添加到集合中时,都会调用添加的文档对象提供的 createMessageAlert 方法,因此您可以在该方法中进行操作并执行以下操作所需的操作。
  2. 当您更新提醒集合时。该集合应该以这样的方式发布(命名为“null”),即它应该是 react 性的,并且应该可以从从不同浏览器实例访问同一帐户的所有实例中使用。

实现

只需在您的 collections.js 中添加以下代码

Meteor.method(
'createMessageAlert': function(id, fields) {
if ( fields.user !== Meteor.userId() ){
Alerts.insert({
userId : fields.user,
roomId : Router.current().params._id, //params id of current room
messageId : id,
read : false
});
}
}
);

var MSG_OBSERVER = Messages.find();

MSG_OBSERVER.observe({
added: function(id, fields){
Meteor.call('createMessageAlert', id, fields);
}
});

Meteor.publish(null ,function() { // null name means send to all clients
//use Messages.insert() to generate a fake message and add data in below params
Meteor.call('createMessageAlert', id, fields);
return Alerts.find();
});

说明

  1. 如果您再次阅读先决条件,您就会理解代码。确保您在客户端订阅了所需的集合。此代码使涉及的每个集合和触发器都非常具有反应性和响应性。
  2. 您添加为消息的任何内容也会添加到提醒中。
  3. 发布“null”只会将数据发布到所有客户端,从而使 UI 行为更加稳健和异步。(我正在使用此功能来显示实时图表,您甚至不需要刷新 UI,您的数据就会得到反射(reflect)。 )
  4. 发布“null”时,您可以创建一个假消息 OBJ 并将其添加到调用 createMessageAlert 函数。您必须执行此操作,因为您必须在服务器重新启动时启动发布。明智地选择消息对象,以免影响工作流程。

关于javascript - Meteor 应用程序上的警报/通知不会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com