如何在不启动初始化的情况下观察Meteor中添加的事件?

时间:2015-10-08 16:43:53

标签: mongodb meteor iron-router

有很多关于这个主题的信息,但我似乎无法让它为自己工作。我正在使用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.)一些触发器或事件告诉我这个集合的重新加载已经完成,所以我可以设置一个表示该变量的变量。

1 个答案:

答案 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会存储您的警报状态。