有很多关于这个主题的信息,但我似乎无法让它为自己工作。我正在使用toastr在我的应用程序的右上角向用户显示事件通知。我需要添加一个观察者来添加'事件到集合,并在添加项目时创建toastr通知。问题是观察者在初始化集合时触发。在我允许观察者代码继续通过并显示通知之前,我尝试了大约六种不同的方法来尝试检查集合是否已准备就绪,但我无法让它始终如一地工作,尤其是在更改时页面。以下是一些示例代码:
MainController = RouteController.extend({
before: [
function() {
deviceEventsInitializing = true;
var alerts = this.subscribe("alerts", Meteor.user()._id);
if (alerts.ready()) {
deviceEventsInitializing = false;
}
Alerts.find().observeChanges({
added: function(id, doc) {
if (deviceEventsInitializing || deviceEventsInitializing == undefined) {
return;
}
doToastrStuff();
}
});
this.next();
}
],
});
这只是我最近的尝试。流程如下:
1。)订阅发生,集合中的所有项目都会命中观察者,但deviceEventsInitializing为true,因此它什么都不做。 2.)alerts.ready()fires和deviceEventsInitilizing设置为false。 3.)添加的触发器再次触发集合中的所有事件,导致为每个项目调用toastr。
我感兴趣的是以下内容:
1。)一些触发器或事件,我可以设置一个变量,表示订阅正在重新加载集合。 2.)一些触发器或事件告诉我这个集合的重新加载已经完成,所以我可以设置一个表示该变量的变量。
答案 0 :(得分:1)
我认为你走在正确的轨道上,但尝试使用IronRouter来管理这样的反应可能是一场噩梦。我以前尝试过失败了。
相反,利用Mongo将您的反应性限制为仅关注您关注的警报。让我们假设您的alerts
数据库看起来像:
{
_id: 1,
hasNotified: false,
...
}
现在,Mongo正在决定什么是新的而不是新的,而不是试图根据IronRouter时序来确定状态。事实上,因为在Meteor中,任何alerts
光标本身都是被动的,你甚至不需要observeChanges
:
MainController = RouteController.extend({
waitOn: function() {
return this.subscribe("alerts", Meteor.userId());
},
data: function() {
var newAlerts = Alerts.find({hasNotified: false}).forEach(function(doc) {
doToastrStuff();
Alerts.update({_id: doc._id}, {$set: {hasNotified: true}});
});
}
})
使用这种架构,导航到其他路线,重新加载页面等不会重新触发任何警报,因为Mongo会存储您的警报状态。