【问题标题】:How to observe added events in Meteor without firing on initialization?如何在不触发初始化的情况下观察 Meteor 中添加的事件?
【发布时间】:2015-10-09 02:52:49
【问题描述】:

那里有很多关于这个主题的信息,但我似乎无法让它为自己工作。我正在使用 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 为真,因此它什么也不做。 2.) alerts.ready() 触发并且 deviceEventsInitilizing 设置为 false。 3.) 为集合中的所有事件再次触发添加的触发器,从而为每个项目调用 toastr。

我只对以下内容感兴趣:

1.) 一些触发器或事件,我可以在其中设置一个表示订阅正在重新加载集合的变量。 2.) 一些触发器或事件告诉我此集合的重新加载已完成,因此我可以设置一个变量来表明这一点。

【问题讨论】:

  • 我没有答案,只有一个建议——你可以通过在路由器之外设置你的 observeChanges 来大大简化任务。 Iron Router before() 钩子设计为在数据更改时多次运行,因此即使您将标志从 true 更改为 false,钩子可能会在标志设置为 true 的情况下从顶部再次运行。从 Meteor.startup 进行观察可能会起作用

标签: mongodb meteor iron-router


【解决方案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 会存储您的警报状态。

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2016-02-11
    • 1970-01-01
    • 2018-01-03
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多