现在我摆脱了对$scope
我的角度控制器的依赖,以确保我可以轻松地将我的代码迁移到 Angular2。我当前的角度版本是1.4.X
. $destroy
在做同样的事情时,我将侦听器放置在我的控制器范围内,例如$scope.$on('$destory', function() ....)
.
我可以看到$on
仅在$scope
控制器上可用的方法,但是如何在不使用$scope
依赖项的情况下实现它。
现在我摆脱了对$scope
我的角度控制器的依赖,以确保我可以轻松地将我的代码迁移到 Angular2。我当前的角度版本是1.4.X
. $destroy
在做同样的事情时,我将侦听器放置在我的控制器范围内,例如$scope.$on('$destory', function() ....)
.
我可以看到$on
仅在$scope
控制器上可用的方法,但是如何在不使用$scope
依赖项的情况下实现它。
如果您使用 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);
};
}
经过一些研究,我发现该$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
上面的答案所示。谢谢 :)