如何在离开 ui-state 时停止 $interval?

Posted

技术标签:

【中文标题】如何在离开 ui-state 时停止 $interval?【英文标题】:How to stop $interval on leaving ui-state? 【发布时间】:2015-09-05 11:38:39 【问题描述】:

Angular,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);
    
;

问题?定时器在离开状态时持续存在。我的理解是,当状态离开时,$scope 和控制器基本上被“破坏”了。因此,基于此,计时器应该停止(在控制器内,我在四处移动时取消计时器,这有效 - 但如果我导航到差异状态,它仍然存在)。我在这里有什么误解?

我猜因为间隔和超时在角度上是services,所以它们随处可用,但我仍然不明白他们如何看待未初始化控制器中的函数,除非它被复制。我的解决方案是只使用常规的旧 js 间隔吗?

【问题讨论】:

原版计时器也会持续存在,除非您将其清除。 【参考方案1】:

清除$destroy上的间隔

像这样

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

【讨论】:

编辑:问题已解决,非常感谢!请修正上面“destroy”的拼写 - 由于 6 个字符的最小编辑长度,我无法更改它。 我的错误 :P 欢迎您并感谢您的更正 :) 为什么一定要查if (angular.isDefined($scope.Timer)) 如果定义了$scope.Timer,那么$interval.cancel($scope.Timer); 可能会抛出异常@BornToCode @BornToCode 你没有触发$scope.startTimer 并转到另一个控制器

以上是关于如何在离开 ui-state 时停止 $interval?的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿中带有参数类型的角度 ui-state

当我离开我的应用程序时如何停止 MediaPlayer,而不是当我移动到另一个 Activity 时(Android Studio)

离开 UIControllerView 时 MapBox 停止位置

jQuery 事件处理程序在离开视图时停止工作

离开 ViewController 时停止 AVCaptureSession

IB_DESIGNABLE 使 Xcode 在离开情节提要时停止响应