【发布时间】:2017-11-09 16:40:06
【问题描述】:
我正在尝试使用 VUE.js 构建番茄钟,下面是我遇到问题的相关代码 sn-p。所以问题是 clearInterval 方法在这里似乎不起作用。
data: {
workTimeInMin: 1,
breakTimeInMin: 1,
timeRemainInMillisecond: 0,
timerOn: false,
rest: false
},
methods: {
startOrStopTheTimer: function() {
var self = this;
var interval;
if (this.timerOn){
this.timerOn = !this.timerOn;
window.clearInterval(interval);
console.log("clearInterval");
}else {
this.timerOn = !this.timerOn;
interval = setInterval(function(){
console.log("123");
if (self.timeRemainInMillisecond <= 0) {
console.log("1");
self.rest = !self.rest;
if (self.rest) {
self.timeRemainInMillisecond = self.restTimeInMin*60*1000;
}else {
self.timeRemainInMillisecond = self.workTimeInMin*60*1000;
}
}
this.timeRemainInMillisecond = this.timeRemainInMillisecond-1000
}, 1000);
}
},
You can find a live demo here.
在页面中,当我单击开始时,会调用一个 set Interval 方法。然后我点击了停止,它应该清除间隔,但它似乎没有按我的意愿工作。可以查看控制台,很容易发现一直弹出“123”,表示间隔没有清除。
在 StackOverFlow 中搜索了一段时间后,我发现如果我将变量 interval 定义为在全局上下文中,它将按我的意愿工作。但我想知道为什么会这样。
我们将非常感谢您的帮助。提前致谢!
【问题讨论】:
-
您意识到
var interval;创建了新变量,其值为undefined? -
使用 window.interval 全局设置值
-
@dfsq 我知道这一点。然后应该在 for 循环的 else 部分将间隔设置为
var interval = setInterval。所以我想知道为什么我不能在这里使用clearInterval。 -
您的
interval变量的作用域是方法,因此每次方法运行时您都会获得一个新变量。我会将其限定为组件——将它放在data块中——而不是用全局变量污染window。 (这也将消除您的timerOn变量的需要。) -
我发现 this.interval 将其设置为对象,而不是 nodejs 环境中的实际 ID。所以我不得不运行
clearInterval(this.interval._id)
标签: javascript jquery vue.js