如何在AngularJS中当不使用时从作用域中移除?

4

我已经设置了一个控制器,每几秒钟就会触发一次,然后调用后端API进行restful请求。一切都按预期运行,但当我导航到另一个部分(由另一个控制器处理)时,tick仍然继续触发。

是否有可能完全从作用域中移除控制器?

以下是当前控制器的剪贴板:

myApp.controller('SupervisorController', function($scope, supervisord, $timeout) {

    $scope.supervisord = supervisord;

    (function tick() {
        $scope.supervisord.fetch();
        $timeout(tick, 2500);
    })();
});

我也很感兴趣知道您是如何使用$watch实现tick的。能否将此内容添加到您的问题中?提前谢谢。 - Xander
2个回答

4

http://docs.angularjs.org/api/ng.$rootScope.Scope上提到:

在作用域销毁之前,会在此作用域上广播$destroy事件。应用程序代码可以注册一个$destroy事件处理程序,以便有机会执行任何必要的清理操作。

这似乎正是你想要的。


你说得对,这正是我在寻找的。最终我将我的tick移动到了$watch中,并添加了一个$destroy事件,它只是删除了我的服务。非常完美,谢谢! - aminal
@Mark Pitman:我有一个类似于你的问题(即轮询REST API)。你写道“最终我将我的tick移动到了$watch中”。你有没有一些代码示例可以解释你的解决方案? - Matthieu Rouget

1
一个解决方法是使用 var myInterval = setInterval(tick, 2500); 来启动它,然后使用 clearInterval(myInterval); 来停止它(或类似的 $timeout.cancel(myInterval))。为此,您需要在两个控制器中都可以访问 myInterval,因此您可能考虑将其包装在 Angular 服务 中。

我可以用当前的方法做同样的事情,但那需要我在一个单独的控制器中清除该间隔,对吗? - aminal
1
我很好奇是否有一种方法可以“观察”控制器,如果用户导航到UI的不同部分,则完全卸载/删除/销毁控制器? - aminal
如果您正在使用 routes,您可能可以在 $routeChangeSuccess 回调中清除计时器。 - mb21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接