gpt4 book ai didi

meteor - 模板被销毁时正确停止 autorun() 函数

转载 作者:行者123 更新时间:2023-12-04 23:50:12 48 4
gpt4 key购买 nike

我有一个包含图表的模板,使用 MorrisJS 呈现。图表应在 currentData 时更新 session 变量已更改,因此我已将其设为响应式数据源:

Template.chart.rendered = function() {

var template = this;

Deps.autorun(function(c) {

// Stop if the template is removed from the dom
// Q: Is this really right?
if(template.__component__.dom.parentNode() === null) {
c.stop();
return;
}

var results = Session.get('currentData');

// ... render a chart with `results` as the data

Morris.Bar({element: template.$(".chart-container"), data: results, ...});

});

};

请注意我如何对何时停止上面的自动运行进行了相当可怕的检查。这是必要的,因为如果没有这个,当我从使用模板的页面(我正在使用 iron-router )导航到另一个页面并返回时,我会在日志中收到警告,例如“无法在已删除的 DomRange 中选择”。我很确定这是因为模板实例被删除了,但自动运行仍在运行。

不过,我觉得我在这里做错了什么。是否有(a)放置自动运行的更好的地方,以便它没有这个问题,或者(b)当模板实例从 DOM 中删除时停止计算的更好方法?

我试图找到一种方法来使用 createddestroyed处理程序,但我无法弄清楚如何。

最佳答案

Tracker.autorun返回一个可以存储为模板实例属性的句柄,然后调用它的 stop onDestroyed 中的方法生命周期事件。

Template.chart.onRendered(function(){
this.computation = Tracker.autorun(function(){...});
});

Template.chart.onDestroyed(function(){
this.computation.stop();
});

编辑 29-09-2014

在较新版本的 Meteor(0.9 以上)中,有一个新的 autorun模板实例上可用的函数提供更简单的代码来实现相同的结果:无需手动存储和停止计算,这由框架处理。
Template.chart.onRendered(function(){
this.autorun(function(){...});
});

关于meteor - 模板被销毁时正确停止 autorun() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317519/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com