2015-06-19 53 views
13

有角度的UI路由器。在像這樣的狀態的控制器中使用$ interval:

$scope.Timer = null; 

$scope.startTimer = function() { 
    $scope.Timer = $interval($scope.Foo, 30000); 
}; 

$scope.stopTimer = function() { 
    if (angular.isDefined($scope.Timer)) { 
     $interval.cancel($scope.Timer); 
    } 
}; 

問題是?計時器在離開狀態時仍然存在。我的理解是,當一個國家離開時,$範圍和控制器基本上被「摧毀」了。所以,在此基礎上,計時器應該停止(在控制器內部,當移動時我取消了計時器,這是有效的 - 但是如果我導航到diff狀態,它仍然存在)。我在這裏誤解了什麼?

我猜因爲間隔和超時是角度爲services,它們在任何地方都可用,但我仍然不明白他們如何在未初始化的控制器中看到函數,除非它被複制。我的解決方案是使用常規的老式js間隔嗎?在$destroy

+1

香草計時器也將持續下去,除非你將其清除。 – Boaz

回答

24

明確的間隔像這樣

$scope.$on("$destroy",function(){ 
    if (angular.isDefined($scope.Timer)) { 
     $interval.cancel($scope.Timer); 
    } 
}); 
+1

編輯:問題解決了,非常感謝!請修正上面「破壞」的拼寫 - 由於6個字符的最小編輯長度,我無法更改它。 – VSO

+0

我的錯誤:P你是歡迎和感謝更正:) –

+0

爲什麼你要檢查'if(angular.isDefined($ scope.Timer))'? – BornToCode

相關問題