2016-04-26 2 views
1

Я использую модуль ngRoute для обработки нескольких ссылок в однострочном приложении angularJS. Иногда пользователи достигают неправильных ссылок, необходимо перенаправить (поскольку контент динамический, он зависит от внешнего источника, но это не имеет значения).Правильный способ обратного отсчета и перенаправления

Предположим, я хочу перенаправить пользователя через 10 секунд, пока я хочу отобразить предупреждение и показать обратный отсчет. Я просто использовать seconds переменной начальной формы 10 и функцию с $interval меньшим количеством секунд до 0, а затем перенаправить

$scope.seconds = 10; 
$scope.startCountdown = function() { 
    var intervalPromise = $interval(function() { 
     if ($scope.seconds > 0) { 
      $scope.seconds--; 
     } 
     else { 
      $interval.cancel(intervalPromise); 
      $location.search({}); 
      $location.path("/"); 
     } 
    }, 1000); 
} 
$scope.startCountdown(); 

Это работает, но когда местоположение изменения пользователя до конца обратного отсчета (он может вызвать $location.path("/Summary") сверху меню) обратный отсчет продолжается в фоновом режиме, и через несколько секунд он перенаправляется на родину.

Как я могу это решить? Я мог бы использовать событие $scope.$on("$routeChangeSuccess", function (args) { ... }, чтобы отменить обещание, но в этом случае мне нужно сохранить переменную intervalPromise и ... похоже, она слишком подключена! Есть ли лучший способ реализовать эту логику обратного отсчета прямо?

ответ

2

Первое использование $timeout не $interval для этого

И почему хранение обещания кажется слишком проводными? Конечно, вам нужно его где-то сохранить, чтобы позвонить ему позже: вот как я это сделаю:

var promise = $timeout(function(){ 
    // your code 
    promise = null; 
    //perform redirect 
}, 10000); 
$scope.$on("$routeChangeSuccess", function (args) { 
    if(promise != null){ 
     $timeout.cancel(promise); 
    } 
}; 

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

  • Нет связанных вопросов^_^