2014-01-28 2 views
2

У меня проблема с простой страницей входа/выхода. Когда пользователь регистрируется в/из, отображается сообщение об успешном завершении с обратным отсчетом. По истечении времени ожидания маршрут изменяется.AngularJS: изменить маршрут до окончания обратного отсчета, но начинается перенаправление

Однако пользователь может перемещаться до окончания обратного отсчета (используя меню или кнопку). Проблема в том, что даже при использовании меню все еще срабатывает тайм-аут входа/выхода.

Здесь код счетчика:

$scope.onTimeout = function(){ 
     $scope.counter--; 
     $scope.timeoutCountdown = $timeout($scope.onTimeout,1000); 
     if($scope.counter === -1){ 
      $scope.safeApply(function() { $location.path("/home"); }); //if the user isn't logged...redirect to main 
     } 
}; 

И это код, который изменит положение при нажатии кнопки:

$scope.redirectToHome = function() { 
     $scope.safeApply(function() { $location.path("/portale"); }); 

}; 

Кто-нибудь знает, почему тайм-аут срабатывает после смены контроллера ?

Заранее спасибо

+0

Укажите «плохой эффект». Что именно происходит неправильно? В его нынешнем виде ваш вопрос очень трудно понять. – thomaux

+0

Я знаю. И это очень сложно объяснить :-). Эффект заключается в том, что когда пользователь переходит к домашнему маршруту с помощью кнопки, а затем изменяет маршрут, например, в маршруте поиска ... обратный отсчет заканчивается и снова изменяет маршрут домой. – sickk

+0

Итак, в основном вы хотите отменить таймаут, если пользователь изменит маршрут до истечения таймаута? – thomaux

ответ

2

вопрос вы испытываете это из-за того тайм-аут не очищается, когда $ Прицел разрушен.

Вам необходимо вручную очистить таймаут, прослушивая событие $destroy. Это событие происходит от Angular и бросается всякий раз, когда $ scope уничтожается. Попробуйте добавить следующую строку в ваш контроллер (я не проверял это, так считают этот псевдо-код)

$scope.$watch('$destroy', function(){ 
    $timeout.cancel($scope.timeoutCountdown); 
}); 

Edit:

Вы также можете сделать это прямо перед изменением маршрута:

$scope.redirectToHome = function() { 
    $timeout.cancel($scope.timeoutCountdown); 
    $scope.safeApply(function() { $location.path("/portale"); }); 
}; 

Просто имейте в виду, что если у вас есть другие возможности перенаправления (то есть другие кнопки, которые пользователь может использовать для навигации со страницы входа/выхода), вам нужно будет сделать это для каждого из них (или, предпочтительно, обернуть его в методе).

+0

Прежде всего: спасибо! Кажется, это правильный путь, но он все еще не работает. Я добавил console.log на ваш «watch», и он печатает, когда контроллер берет элемент управления, и он не печатает, когда я меняю маршрут с помощью кнопки. – sickk

+0

Это означает, что контроллер не будет уничтожен при изменении маршрута. Не могли бы вы обновить свой вопрос и добавить часть своего кода, где вы настраиваете новый маршрут? – thomaux

+0

Сделано! Но это очень просто: я меняю место. – sickk

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