Javascript 在angular中使用controllerAs语法时如何将listen置于$destroy之上

Javascript 在angular中使用controllerAs语法时如何将listen置于$destroy之上,javascript,angularjs,events,angularjs-lifecycle,Javascript,Angularjs,Events,Angularjs Lifecycle,现在我摆脱了AngularController中的$scope依赖关系,以确保可以轻松地将代码迁移到Angular2。我当前的角度版本是1.4.X。 在做同样的事情时,当我将$destroy侦听器放置在我的控制器作用域上时,有一个位置,就像$scope.$on('$destory',function()…) 我只能在控制器的$scope上看到$on方法,但如何在不使用$scope依赖项的情况下实现它。经过一些研究后,我发现$destroy事件是在删除DOM时发出的&在它广播的同一DOM作用域上$

现在我摆脱了AngularController中的
$scope
依赖关系,以确保可以轻松地将代码迁移到Angular2。我当前的角度版本是
1.4.X
。 在做同样的事情时,当我将
$destroy
侦听器放置在我的控制器作用域上时,有一个位置,就像
$scope.$on('$destory',function()…)


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

经过一些研究后,我发现
$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+版本,您可以 可以使用角度
生命周期挂钩
,如所示
@pgreen2
在上面的答案中。谢谢:)


如果您使用的是angular 1.5+,他们补充说您可以选择控制器。不需要
$scope
。只需将名为
$onDestroy()
的函数添加到控制器中,在清理控制器时将调用该函数:

$onDestroy()
-当控制器的包含范围为 摧毁。使用此钩子释放外部资源、手表和 事件处理程序

示例来自:


谢谢分享。我的答案只是解决了1.4.X版本之前的问题,但你的解决方案对我来说很有希望,因为它将适用于1.5+,基本上我的项目是在1.4.X版本上进行的,我努力让它在几个小时内正常工作,
$element.$on(“$destroy”,…)
正常工作。。所以我加了它,谢谢:-)
function MyCmpController($element) {

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

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

  this.$onDestroy = function () {
    $element.off('click', clickHandler);
  };
}