2016-01-21 111 views
0

我正在显示一个计时器,显示自创建集合项目以来经过的时间。但是,当我在Items(切换路线/ url)之间导航时,定时器不会被破坏,并最终产生一堆泄漏的定时器。Template.destroyed()not called

我可以保留对计时器的引用并在路由器中将其杀死,但我更喜欢更简洁的方式并在模板中处理它。有任何想法吗?

<template name="itemDetails"> 
    {{elapsedTime}} 
</template> 

Template.itemDetails.onRendered = function() { 
    var startTime = Template.currentData().startTime; 
    this.timeElapsed = new ReactiveVar; 

    this.taskTimer = Meteor.setInterval(function() { 
     var timeElapsedInMS = Date.now() - startTime;  
     var date = new Date(timeElapsedInMS); 
     var hours = (date.getUTCHours() < 10 ? '0' :'') + date.getUTCHours(); 
     var minutes = (date.getUTCMinutes() < 10 ? '0' :'') + date.getUTCMinutes(); 
     var seconds = (date.getUTCSeconds() < 10 ? '0' :'') + date.getUTCSeconds(); 

     var timeElapsed = hours + ":" + minutes + ":" + seconds; 
     this.timeElapsed.set(timeElapsed); 
     console.log(timeElapsed); 
    }, 1000); 
} 

Template.itemDetails.helpers({ 
elapsedTime: function() { 
    return Template.timeElapsed.get(); 
} 
}); 

Template.itemDetails.onDestroyed = function() { 
    Meteor.clearInterval(this.taskTimer); 
} 
+0

使用该功能“onDestroyed”,而不是“破坏”。当你说导航时,你的意思是另一个页面?如果html没有被重新渲染,它不会被视为“销毁”,因此'onDestroyed'内的代码不会被调用。请参阅http://docs.meteor.com/#/full/template_onDestroyed – meteorBuzz

+0

上的文档因此,我必须保持对定时器的全局引用并在路由器中将其杀死。 – oskare

回答

0

我会这样做(模板级别)以及。这里是你如何可以在模板级别做一个计时器一个简单的例子:)

<template name="test"> 
    <p>Count: {{time}}</p> 
</template> 

Template.test.onCreated(function() { 
    var self = this; 
    self.time = new ReactiveVar(0); 

    self.taskTimer = Meteor.setInterval(function() { 
     self.time.set(self.time.get() + 1) 
    }, 1000); 
}); 

Template.test.onDestroyed(function() { 
    Meteor.clearInterval(this.taskTimer); 
}); 

Template.test.helpers({ 
    time: function() { 
     var self = Template.instance(); 
     return self.time.get(); 
    } 
}); 

我希望你可以从这里继续=