2014-02-05 7 views
24

У меня есть функция внутри контроллера, которая основана на setInterval. Я заметил, что после первого вызова он работал нормально, но продолжался даже после того, как маршрут изменился. Впоследствии я попытался использовать встроенную услугу $ interval, которая автоматически отслеживала изменения в области. Однако проблема остается. Так что теперь у меня есть два вопроса. Первый - что я могу сделать, чтобы использовать повторяющуюся функцию внутри определенного контроллера, которая останавливается, когда пользователь покидает этот маршрут? Также почему функция области продолжается, так как я изменил области?

UPDATE - Кодекс, как этот

$scope.refreshScore() { 
     .... 
     } 
$scope.refreshMe = function(){ 
    $interval($scope.refreshScore, 10000); 
} 
+0

Я использовал это решение, и оно работает хорошо: http://stackoverflow.com/a/24324902/1393774 – Virako

ответ

37

Может быть, попробуйте отключить его на уничтожить события сферы.

$scope.refreshScore() { 
    .... 
} 
var intervalPromise; 
$scope.refreshMe = function(){ 
    intervalPromise = $interval($scope.refreshScore, 10000); 
} 
$scope.$on('$destroy',function(){ 
    if(intervalPromise) 
     $interval.cancel(promiseFromInterval); 
}); 

$interval не может быть лучшим решением для этого, особенно если это какая-либо операция асинхронная. Если вы абсолютно необходимо иметь некоторую временную работу, которую вы хотите иметь место драгоценно каждый х мс я хотел бы использовать что-то вроде этого:

var refreshingPromise; 
var isRefreshing = false; 
$scope.startRefreshing = function(){ 
    if(isRefreshing) return; 
    isRefreshing = true; 
    (function refreshEvery(){ 
     //Do refresh 
     //If async in then in callback do... 
     refreshingPromise = $timeout(refreshEvery,10000) 
    }()); 
} 

Затем сделайте то же самое, что и выше

Если у вас возникли проблемы, отменяющие обновление, которое вы можете попробовать подписаться на какое-то событие изменения маршрута. И делаю это там.

+0

Я обновил код. Не могли бы вы немного объяснить, что измениться? Также почему функция продолжает получать вызовы, так как я использую Angular wrapper setInterval? – anges244

+0

Это только оболочка, которая не меняет то, что делает setInterval, могу ли я спросить, что вы пытаетесь обновить? Возможно, использование '$ interval' - не лучшее решение. – calebboyd

+1

Мне нужно обновить поток событий, полученных от сервера, путем опроса каждые 10 секунд, чтобы проверить, произошли ли новые события. Это прекрасно работает на маршруте, который предполагалось, но продолжается после изменения маршрута. Я попытался использовать $ scope.on ($ destroy, ...), но он не работает для меня ... Может быть, я делаю что-то неправильно ... Я получаю, что $ interval - это всего лишь оболочка, но не так ли? предположительно, чтобы прикрепить $ watch и остановить изменения маршрута? – anges244

2

Для одного простого решения вы можете просто использовать $location.$$path, прежде чем запускать событие, связанное с интервалом.

Если путь не коррелирует с ui, не запускайте его и не отменяйте.

6

Попробуйте это:

$scope.refreshScore = function() { 
     // your logic here 
    } 
    var promise = $interval($scope.refreshScore, 10000); 
    $scope.$on('$destroy',function(){ 
     if(promise) 
      $interval.cancel(promise); 
    }); 

Он разрушит интервал при изменении маршрута.

+1

(Я не думаю, что вам нужно проверить «обещание»), но это должен быть принятый ответ. – Startec

+0

@Startec В этом конкретном примере вы правы, что проверка обещания не требуется. Но на практике это обещание можно было бы отменить в каком-то другом месте приложения. Так что действительно хорошая идея обеспечить обещание, прежде чем пытаться его отменить. – Matt

Смежные вопросы