2016-04-26 22 views
1

私は012Jモジュールを使用して、angularJS単一ページアプリケーションの複数のリンクを処理しています。ユーザーが間違ったリンクに到達すると、リダイレクトする必要があります(コンテンツは動的なので外部ソースに依存しますが、関連性はありません)。カウントダウンとリダイレクトの適切な方法

10秒後にユーザーをリダイレクトするとしますが、警告を表示してカウントダウンを表示するとします。私は、その後、リダイレクトseconds変数の出発フォーム10と0になるまでの秒$interval小さい数を持つ関数を使用し

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