如何在angular中使用controllerAs语法时监听$ destroy

时间:2016-07-01 11:22:55

标签: javascript angularjs events angularjs-lifecycle

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

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

2 个答案:

答案 0 :(得分:4)

如果您使用1.5+角,他们添加了lifecycle hooks,您可以选择加入控制器。不需要$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);
  };
}

答案 1 :(得分:3)

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

你知道有一个依赖项$element,如果你在控制器中注入它会给你带有ng-controller指令位置的DOM。因此,在您的控制器和放大器中注入$element然后把听众放在下面

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

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