AngularJS - 递归函数禁用$ scope.on(' destroy')

时间:2015-11-10 11:32:59

标签: javascript angularjs angularjs-scope

我有一个递归函数调用另一个异步函数,并在解析promise后几秒后再次调用自己:

$scope.gamePolling = function () {
  if ($scope.getGames) {
    $scope.getGameData().then(function () {
      $timeout(function () {
        $scope.gamePolling();
      }, 3000);
    });
  }
};

当改变路由/状态(使用ui-router)时,我认为$ scope应该被销毁,所以我可以使用以下命令关闭递归函数:

$scope.$on('destroy', function () {
  $scope.getGames = false;
});

然而,在下一页中,gamePolling函数不断调用自身,因为destroy中的断点永远不会被击中。

所以我的问题是为什么没有触发$ destroy事件? 附:删除$ timeout时也会发生这种情况,因此问题必须与递归有关。

通过关闭$ stateChangeStart中的gamePolling(),我解决了这个问题:

$scope.$on('$stateChangeStart', function () {
  $scope.getGames = false;
});

因此,轮询停止 $ destroy事件似乎仍无法触发。

作为一个小测试,在状态/控制器A中,我将当前$ scope分配给$ rootScope变量,以便我可以检查它是否在状态/控制器B中被销毁:$rootScope.testScope = $scope;

检查控制器B中的$rootScope.testScope.$$destroyed时,它返回 true 。所以看起来控制器A的$ scope被成功销毁了。但是,在$ rootScope.testScope中,我仍然可以访问分配给$ scope的变量。

1 个答案:

答案 0 :(得分:2)

它是" $ destroy"事件,而不是"销毁"

这很有趣,因为你提到了具有正确名称的事件,并且在代码中你缺少$符号前缀。

希望它有所帮助!

更新:如果你允许我,我建议你使用间隔而不是超时+递归功能。然后你可以杀死" $ destroy事件处理程序中的间隔。