Функция интервала AngularJS $продолжается после изменения маршрута
У меня есть функция внутри контроллера, которая основана на setInterval. Я заметил, что после первого вызова он работал нормально, но продолжался даже после того, как маршрут изменился. Впоследствии я попытался использовать встроенную услугу $interval, которая автоматически отслеживала изменения в области. Однако проблема остается. Так что теперь у меня есть два вопроса. Первый - что я могу сделать, чтобы использовать повторяющуюся функцию внутри определенного контроллера, которая останавливается, когда пользователь покидает этот маршрут? Также почему функция области действия продолжается, так как я изменил области?
UPDATE - Код выглядит следующим образом
$scope.refreshScore() {
....
}
$scope.refreshMe = function(){
$interval($scope.refreshScore, 10000);
}
Ответы
Ответ 1
Возможно, попробуйте отменить его в событии destroy области.
$scope.refreshScore() {
....
}
var intervalPromise;
$scope.refreshMe = function(){
intervalPromise = $interval($scope.refreshScore, 10000);
}
$scope.$on('$destroy',function(){
if(intervalPromise)
$interval.cancel(promiseFromInterval);
});
$interval
может быть не лучшим решением для этого, особенно если это некоторая операция async. Если вам абсолютно необходимо иметь некоторую временную операцию, которую вы хотите совершить с огромным успехом каждые x мс, я бы использовал что-то вроде этого:
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)
}());
}
Затем сделайте то же самое, что и выше
Если у вас возникли проблемы с отменой обновления, вы можете попробовать подписаться на какое-то событие изменения маршрута. И делайте это там.
Ответ 2
Попробуйте следующее:
$scope.refreshScore = function() {
// your logic here
}
var promise = $interval($scope.refreshScore, 10000);
$scope.$on('$destroy',function(){
if(promise)
$interval.cancel(promise);
});
Он уничтожит интервал, когда вы измените маршрут.
Ответ 3
Для одного простого решения вы можете просто использовать $location.$$path
, прежде чем запускать событие, связанное с интервалом.
Если путь не коррелирует с ui, не запускайте его и не отменяйте.