清除 Angular 函数内部超时
Clear Angular timeout inside function
我用 Angular 构建了一个非常简单的滑块,如下所示:
$scope.slider = {};
$scope.slider.pane = 1;
$scope.slider.auto = true;
var slider = function(){
$timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
slider();
滑块函数创建一个超时循环,每 4 秒更改一次 slider.pane
的值。在 HTML 中,我有一个 link,单击它时会将值 slider.auto
设置为 false
。
<a href="" ng-click="slider.auto=false">Stop slider</a>
点击这个时,需要停止超时循环。当时可能在一个循环的中间,所以我需要清除超时,但它在一个函数中,所以不知道如何访问它。
使用$timeout.cancel
函数:
var timeout;
$scope.cancelTimer = function() {
$scope.slider.auto=false;
$timeout.cancel(timeout);
};
var slider = function(){
timeout = $timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
slider();
//HTML
<a href="" ng-click="cancelTimer()">Stop slider</a>
尝试:
$scope.slider = {};
$scope.slider.pane = 1;
$scope.slider.auto = true;
var promise;
var slider = function(){
promise = $timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
$scope.autoSliderFalse = function() {
$scope.slider.auto = false;
if(promise)
$timeout.cancel(promise);
});
slider();
HTML
<a href="" ng-click="autoSliderFalse()">Stop slider</a>
您可以使用此处有人建议的 cancel
方法。
我实际上认为在你的情况下你应该使用 $interval 而不是 $timeout
。
var interval = $interval(function(){
if ($scope.slider.pane === 4) {
$scope.slider.pane = 1;
}
else {
$scope.slider.pane ++;
}
}, 4000);
$scope.stopSlider = function(){
$interval.cancel(interval);
};
//html
<a href="" ng-click="stopSlider()">Stop slider</a>
我用 Angular 构建了一个非常简单的滑块,如下所示:
$scope.slider = {};
$scope.slider.pane = 1;
$scope.slider.auto = true;
var slider = function(){
$timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
slider();
滑块函数创建一个超时循环,每 4 秒更改一次 slider.pane
的值。在 HTML 中,我有一个 link,单击它时会将值 slider.auto
设置为 false
。
<a href="" ng-click="slider.auto=false">Stop slider</a>
点击这个时,需要停止超时循环。当时可能在一个循环的中间,所以我需要清除超时,但它在一个函数中,所以不知道如何访问它。
使用$timeout.cancel
函数:
var timeout;
$scope.cancelTimer = function() {
$scope.slider.auto=false;
$timeout.cancel(timeout);
};
var slider = function(){
timeout = $timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
slider();
//HTML
<a href="" ng-click="cancelTimer()">Stop slider</a>
尝试:
$scope.slider = {};
$scope.slider.pane = 1;
$scope.slider.auto = true;
var promise;
var slider = function(){
promise = $timeout(function(){
if ($scope.slider.pane === 4) $scope.slider.pane = 1;
else $scope.slider.pane ++;
slider();
}, 4000);
}
$scope.autoSliderFalse = function() {
$scope.slider.auto = false;
if(promise)
$timeout.cancel(promise);
});
slider();
HTML
<a href="" ng-click="autoSliderFalse()">Stop slider</a>
您可以使用此处有人建议的 cancel
方法。
我实际上认为在你的情况下你应该使用 $interval 而不是 $timeout
。
var interval = $interval(function(){
if ($scope.slider.pane === 4) {
$scope.slider.pane = 1;
}
else {
$scope.slider.pane ++;
}
}, 4000);
$scope.stopSlider = function(){
$interval.cancel(interval);
};
//html
<a href="" ng-click="stopSlider()">Stop slider</a>