2015-04-15 3 views
3

Я построил очень просто слайдер с Угловое, как так:Очистить Угловая таймаут внутри функции

$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(); 

Функция слайдера создает цикл ожидания, чтобы изменить значение slider.pane каждого 4s. В HTML у меня есть ссылка, которая при нажатии устанавливает значение slider.auto в false.

<a href="" ng-click="slider.auto=false">Stop slider</a> 

При щелчке по нему необходимо остановить цикл таймаута. Это может быть в середине цикла в то время, поэтому мне нужно очистить таймаут, но он находится внутри функции, поэтому не уверен, как получить к ней доступ.

+1

http://stackoverflow.com/a/21019006/3894168 может помочь. – Zee

+0

@ Sourabh- спасибо, но это не работает. Переменная обещания не будет доступна вне моей функции слайдера. – Coop

+0

Вы можете выполнить свое обещание как глобальную переменную для доступа к ней за пределами. – Zee

ответ

4

$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> 
+0

Не является ли переменная таймаута областью действия функции ползунка и, следовательно, недоступна в функции cancelTimer? – Coop

+0

Ах нет, я вижу, что вы сделали его глобальным первым – Coop

+0

Да, его видно в обеих функциях – eladcon

0

Try:

$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> 
0

Вы можете использовать метод 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> 
Смежные вопросы