【发布时间】:2015-11-19 20:31:36
【问题描述】:
我有一个包含图表的模板,使用 MorrisJS 呈现。当 currentData 会话变量更改时,图表应该会更新,因此我将其设置为反应式数据源:
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 中删除模板实例时停止计算的更好方法?
我试图找到一种使用 created 和 destroyed 处理程序的方法,但我不知道如何。
【问题讨论】:
标签: meteor