AngularJS:在重定向倒计时用完之前更改路线但重定向开始

时间:2014-01-28 16:36:26

标签: javascript angularjs countdown

我遇到了一个简单的登录/注销页面的问题。当用户登录/注销时,会显示带倒计时的成功消息。当timout到期时,路线会改变。

但是,用户可以在倒计时结束前(使用菜单或按钮)导航。问题是即使使用菜单,登录/超时仍会触发。

这里是柜台的代码:

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

};

有人知道更改控制器后超时发生的原因吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

您遇到的问题是由于$ scope被销毁时超时未被清除。

您需要通过收听$destroy事件手动清除超时。此事件源自Angular,每当$ scope被销毁时都会抛出此事件。尝试将以下内容添加到控制器中(我没有对此进行测试,因此请考虑此伪代码)

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

编辑:

您也可以在更改路线之前执行此操作:

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

请记住,如果您有其他重定向可能性(即用户可以用来从登录/输出页面导航的其他按钮),您需要为每个按钮执行此操作(或者最好将其包装在其中)方法)。