[英]Meteor : How to clearInterval() onDestroyed() created in onRendered()
I have a countdown function to run every sec, So i proffered setInterval()
. 我有一个倒计时功能每秒运行,所以我提供了setInterval()
。 After I moved to another template, the interval function keep on running. 移动到另一个模板后,间隔功能继续运行。 How to destroy it onDestroyed()
. 如何在onDestroyed()
上销毁它。 Below code will help you to understand well. 下面的代码将帮助您理解。
<template name="Home">
<h4>{{timeremaining}}</h4>
</template>
Template.Home.helpers({
timeremaining : function(){
return Session.get('timeremaining');
}
});
Template.Home.onRendered(function () {
// time functions begin
var end_date = new Date(1476337380000); // I am getting timestamp from the db.
var run_every_sec = setInterval(function () {
var current_date = new Date();
var remaining = end_date.getTime() - current_date.getTime();
var oneDay = 24*60*60*1000;
var diffDays = Math.round(Math.abs(remaining/oneDay));
console.log(remaining); // am getting this log in every template.
if (remaining > 0) {
//set remaining timeLeft
Session.set('timeremaining',diffDays + ' Days ' + (Math.abs(end_date.getHours()-current_date.getHours())).toString() + ' Hrs ' + (Math.abs(end_date.getMinutes()-current_date.getMinutes())).toString() + ' Min ' + (60 - end_date.getSeconds()-current_date.getSeconds()).toString() + ' Sec ')
} else {
clearInterval(run_every_sec);
}
}, 1000);
//time functions end
}.bind(this));
Template.Home.onDestroyed(function () {
clearInterval(run_every_sec); // Here I cant remove this time interval
});
We can declare run_every_sec
as global function. 我们可以将run_every_sec
声明为全局函数。 If so How to pass end_date
. 如果是这样如何传递end_date
。 I dont think its wise idea to declare end_date
inside the run_every_sec
because its coming from db. 我认为在run_every_sec
声明end_date
是run_every_sec
因为它来自db。
If you store the interval in file scope like Repo suggested, you'll have problems if there's ever more than one instance of the template at a time: both instances will use the same run_every_sec
variable. 如果将间隔存储在文件范围内,如Repo建议的那样,如果模板一次有多个实例,则会出现问题:两个实例都将使用相同的run_every_sec
变量。 In this case, you'll need to store the interval on the template instance, which can be accessed as this
inside onRendered
and onDestroyed
: 在这种情况下,您需要在模板实例上存储间隔,可以在onRendered
和onDestroyed
访问this
实例:
Template.Home.onRendered(function () {
this.run_every_sec = setInterval(/* ... */);
});
Template.Home.onDestroyed(function () {
clearInterval(this.run_every_sec);
});
That way, each instance of the template will have its own run_every_sec
property. 这样,模板的每个实例都将拥有自己的run_every_sec
属性。
You should declare "run_every_sec" outside "onRendered". 你应该在“onRendered”之外声明“run_every_sec”。
So instead of this: 所以不是这样的:
Template.Home.onRendered(function () {
// time functions begin
var end_date = new Date(1476337380000); // I am getting timestamp from the db.
var run_every_sec = setInterval(function () {
..do this: ..做这个:
var run_every_sec;
Template.Home.onRendered(function () {
// time functions begin
var end_date = new Date(1476337380000); // I am getting timestamp from the db.
run_every_sec = setInterval(function () {
then it will be available in "onDestroyed" 然后它将在“onDestroyed”中可用
You should use Meteor's setInterval and clearInterval to make sure they run within a fiber. 您应该使用Meteor的setInterval和clearInterval来确保它们在光纤内运行。 You can find more info here https://docs.meteor.com/api/timers.html . 您可以在https://docs.meteor.com/api/timers.html找到更多信息。
var intervalID
Template.myTemplate.onRendered(function() {
intervalID = Meteor.setInterval(function() {
//do something
}, 1000)
})
Template.myTemplate.onDestroyed(function() {
Meteor.clearInterval(intervalID)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.