4

现在我摆脱了对$scope我的角度控制器的依赖,以确保我可以轻松地将我的代码迁移到 Angular2。我当前的角度版本是1.4.X. $destroy在做同样的事情时,我将侦听器放置在我的控制器范围内,例如$scope.$on('$destory', function() ....).

我可以看到$on仅在$scope控制器上可用的方法,但是如何在不使用$scope依赖项的情况下实现它。

4

2 回答 2

4

如果您使用 Angular 1.5+,他们添加了生命周期挂钩,您可以在控制器上选择加入。不需要$scope。只需添加一个调用$onDestroy()到您的控制器的函数,它将在您的控制器被清理时调用:

$onDestroy()- 当其包含范围被销毁时在控制器上调用。使用此钩子释放外部资源、监视和事件处理程序。

来自http://blog.thoughtram.io/angularjs/2016/03/29/exploring-angular-1.5-lifecycle-hooks.html的示例:

function MyCmpController($element) {

  var clickHandler = function () {
    // do something
  };

  this.$onInit = function () {
    $element.on('click', clickHandler);
  };

  this.$onDestroy = function () {
    $element.off('click', clickHandler);
  };
}
于 2016-07-01T11:33:36.463 回答
3

经过一些研究,我发现该$destroy事件是在删除 DOM 时发出的,并且在它广播$destroy事件的同一个 DOM 范围内,但同时该事件已被传播,DOM将被删除。

你知道有一个依赖$element,如果你在控制器中注入它会给你一个你有ng-controller指令位置的DOM。所以注入$element你的控制器然后像下面这样将监听器放在它上面

$element.on('$destroy', function(){
   //write clean up code here
});

我的解决方案将工作到 1.4.X 版本。对于 1.5.3+ 版本,您可以使用 Angular lifecycle hook$onDestroy@pgreen2上面的答案所示。谢谢 :)

于 2016-07-01T11:22:55.470 回答