现在我摆脱了角度控制器的$scope
依赖关系,以确保我可以轻松地将我的代码迁移到Angular2。我目前的角度版本是1.4.X
。
虽然我做了同样的事情,但我将$destroy
监听器放在我的控制器范围内,如$scope.$on('$destory', function() ....)
。
我可以看到$on
方法仅在控制器的$scope
上可用,但如何在不使用$scope
依赖项的情况下实现它。
答案 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
在上面的回答中。谢谢:))