问题 Meteor - 模板被销毁时停止跟踪器自动运行(用户离开页面)


在我的Meteor模板中,我有一个名为的函数 ohlcInit() 当Mongo中有新数据时自动运行:

Template.Live.rendered = function(){

  function ohlcInit() {
    // computations run here
  }

  Tracker.autorun(function() {
      ohlcInit();
  });
};

当用户在页面/模板上进行全部定义时,这非常有用,但只要用户导航到站点上的另一个URL并且模板被销毁,就会在控制台中抛出错误:

Tracker重新计算功能的例外情况:undefined不是一个函数   TypeError:undefined不是函数       在ohlcInit(HTTP://本地主机:3000 /客户/视图/现场/ live.js dd5fb618daf9ea9e233c37caaaa9ed200fe3e987:271:33)       在 HTTP://本地主机:3000 /客户/视图/现场/ live.js dd5fb618daf9ea9e233c37caaaa9ed200fe3e987:306:5       在Tracker.Computation._compute(HTTP://本地主机:3000 /包/ tracker.js 192a05cc46b867dadbe8bf90dd961f6f8fd1574f:288:36)       在Tracker.Computation._recompute(HTTP://本地主机:3000 /包/ tracker.js 192a05cc46b867dadbe8bf90dd961f6f8fd1574f:302:14)       在Tracker.flush(HTTP://本地主机:3000 /包/ tracker.js 192a05cc46b867dadbe8bf90dd961f6f8fd1574f:430:14

当用户导航到新的URL /模板时,如何安全地停止/结束自动运行计算?
我在用 iron:router


2410
2017-11-14 07:36


起源



答案:


使用新的 Template.autorun function,在模板被销毁后自动清理。在一个内部使用它 rendered 回调,只需要替换 Tracker.autorun 同 this.autorun


16
2017-11-14 07:42



谢谢!刚刚在Meteor github回购中看到了同样的解释: github.com/meteor/meteor/issues/2057 - Jon Cursi
我遇到了同样的问题,但我开始了 Tracker.autorun 在客户端上调用Meteor方法的回调。我正在服务器上启动一个进程,然后如果启动进程没有错误,则需要监听一些数据库值。它们工作正常,除了我在销毁模板时遇到同样的错误。运用 this.autorun 在回调范围内不起作用。我假设没有办法打电话给停止 .destroyed 因为范围问题。 - evolross
我想到了。只需要设置一个 var template = Template.instance() 在正确的范围内 之前 我的Meteor方法调用。然后在回调代码调用中 template.autorun(function ... 指上述变量的作用是完美的。 - evolross
你好@DavidWeldon ,,你能给出一个简单的例子.. ??我已阅读文档,但不明白,
@KarinaL看看我的答案 这里 和 这里。希望那些会有所帮助。如果您有一些无法使用的特定代码,我建议您提出一个新问题。 - David Weldon


答案:


使用新的 Template.autorun function,在模板被销毁后自动清理。在一个内部使用它 rendered 回调,只需要替换 Tracker.autorun 同 this.autorun


16
2017-11-14 07:42



谢谢!刚刚在Meteor github回购中看到了同样的解释: github.com/meteor/meteor/issues/2057 - Jon Cursi
我遇到了同样的问题,但我开始了 Tracker.autorun 在客户端上调用Meteor方法的回调。我正在服务器上启动一个进程,然后如果启动进程没有错误,则需要监听一些数据库值。它们工作正常,除了我在销毁模板时遇到同样的错误。运用 this.autorun 在回调范围内不起作用。我假设没有办法打电话给停止 .destroyed 因为范围问题。 - evolross
我想到了。只需要设置一个 var template = Template.instance() 在正确的范围内 之前 我的Meteor方法调用。然后在回调代码调用中 template.autorun(function ... 指上述变量的作用是完美的。 - evolross
你好@DavidWeldon ,,你能给出一个简单的例子.. ??我已阅读文档,但不明白,
@KarinaL看看我的答案 这里 和 这里。希望那些会有所帮助。如果您有一些无法使用的特定代码,我建议您提出一个新问题。 - David Weldon