如何在流星中加载页面后调用函数

时间:2017-02-28 06:29:01

标签: javascript jquery angularjs meteor angular-meteor

我使用cursor.observechanges查看是否有任何新记录插入mongo并提供新的recored插入通知并且它正常工作。但这里的问题是我的应用程序第一次加载时,我得到那些通知警报,因为它观察到这些变化。我点击下一页时的方式。

cursor.observeChanges({
  added: function(id, object) {
    Notification.error('NEW Record',object);
    var audio = new Audio('audio.mp3');
    audio.play();
  }
});

所以我需要在页面加载后才调用此函数。我尝试使用

Template.foo.onRendered(function () {
  cursor.observeChanges({
    added: function(id, object) {
      Notification.error('NEW Record',object);
      var audio = new Audio('audio.mp3');
      audio.play();
    }
  });
});

但它在我的情况下没有用。我们还有其他方法可以做到这一点。或者如果可能的话,我们如何设置5秒的时间并在该时间间隔后调用上述功能? 任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

根据docs Template#onRendered

  

在将此模板的实例插入DOM时注册要调用的函数。

尝试将代码包装在Meteor.defer中:

Template.foo.onRendered(function() {
  Meteor.defer(function() {
    cursor.observeChanges({
      added: function(id, object) {
        Notification.error('NEW Record',object);
        var audio = new Audio('audio.mp3');
        audio.play();
      }
    });
  })
});

如果无效,请尝试将其打包在Meteor.setTimeout

Template.foo.onRendered(function() {
  Meteor.setTimeout(function() {
    cursor.observeChanges({
      added: function(id, object) {
        Notification.error('NEW Record',object);
        var audio = new Audio('audio.mp3');
        audio.play();
      }
    });
  }, 5000)
});

答案 1 :(得分:0)

行为是正确的,因为对于模板,确实添加了那些记录。浏览并浏览,重新创建模板,现在所有这些相同的记录再次成为模板的新内容。

您需要将新记录的概念与模板分开,并将记录作为应用程序的新记录。

我可以通过时间戳解决这个问题。 e.g。

  1. 编写提供服务器当前时间的Meteor方法
  2. 在模板的onCreated()中,调用该方法并保存结果
  3. 在添加的:处理程序中,将添加项的创建时间戳与保存时间的创建时间戳进行比较
  4. 如果添加的项目较旧,则不执行任何操作
  5. 如果添加的项目较新,请采取行动
  6. 这意味着您的收藏将需要一个createdAt字段。

    此解决方案既可用于重新加载应用,也可用于浏览模板或从模板进行浏览以及长时间运行的模板。

    为了获得最佳效果,请不要开始订阅,直到Meteor方法调用返回服务器时间为止。所有这些都应该发生在onCreated()。