Javascript AngularJS:在重定向倒计时结束前更改路由,但重定向开始

Javascript AngularJS:在重定向倒计时结束前更改路由,但重定向开始,javascript,angularjs,countdown,Javascript,Angularjs,Countdown,我有一个简单的登录/注销页面的问题。当用户登录/注销时,将显示一条带有倒计时的成功消息。超时过期时,路由将更改 但是,用户可以在倒计时结束前导航(使用菜单或按钮)。问题是,即使在使用菜单时,login/-out超时仍然会触发 这里是计数器的代码: $scope.onTimeout = function(){ $scope.counter--; $scope.timeoutCountdown = $timeout($scope.onTimeout,1000);

我有一个简单的登录/注销页面的问题。当用户登录/注销时,将显示一条带有倒计时的成功消息。超时过期时,路由将更改

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

这里是计数器的代码:

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

};
有人知道为什么更改控制器后会触发超时吗


提前感谢

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

您需要通过监听
$destroy
事件手动清除超时。此事件起源于Angular,并在销毁$scope时抛出。尝试向控制器添加以下内容(我没有测试这个,所以考虑这个伪代码)

编辑:

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

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

请记住,如果您有其他重定向可能性(即用户可以使用其他按钮从“登录”/-out”页面导航),则需要对其中每一个进行重定向(或者最好将其包装在方法中)。

指定“不良影响”。到底出了什么问题?以目前的形式,你的问题很难理解。我知道。而且很难解释:-)。其效果是,当用户使用按钮转到主路线,然后更改路线,例如,在搜索路线中…倒计时结束,并再次使用主路线更改路线。因此,如果用户在超时过期之前更改路线,基本上您希望取消超时?是的。我使用angularJS的时间不长,但我不明白:我以为当您更改路由时,前面的$scope/Controller会死掉。但是我错了,或者我错过了什么?好的,谢谢你的澄清。我补充了一个答案,我希望这有帮助。首先:谢谢!这似乎是正确的方法,但仍然不起作用。我在您的“watch”上添加了一个console.log,当控制器控制时它会打印,当我用按钮更改路由时它不会打印。这意味着当路由更改时控制器不会被破坏。您能更新您的问题并添加代码中设置新路线的部分吗?完成!但是很简单:我改变了位置。嗯,你能为这个创建一个plunkr()吗。我很乐意为您调试它,但从这一点上很难判断是什么问题。太棒了!非常有用。
$scope.redirectToHome = function() {
    $timeout.cancel($scope.timeoutCountdown);
    $scope.safeApply(function() { $location.path("/portale"); });
};