我一直在玩ES6和角度,我使用eslint-plugin-angular
来验证我的javascript。我有以下服务:
export function runBlock ($rootScope, $state, $log) {
'ngInject';
$rootScope.$on( '$stateChangeStart', function(event, toState) {
// ...
} );
但是eslint
给了我以下错误:
The "$on" call should be assigned to a variable, in order to be
destroyed during the $destroy event
我的意思是我理解这个警告,但是我在以前的角度项目中从未这样做过,如果我做了错误建议的话?为什么需要/良好实践?
eslint-plugin-angular
参考John Papa's angular styleguide的文档,但我并没有真正发现这种情况。
答案 0 :(得分:8)
johnpapa样式指南不仅没有提到这种情况,它实际上还包括一个忽略$rootScope.$on
返回的例子。但是,关于one of the eslint-plugin-angular issues的讨论稍微澄清了意图:
如果控制器正在
$rootScope
上注册一个监听器,那么它应该在"$destroy
"中被手动销毁。因为根范围将比所有控制器寿命更长。 - davidmason
该帖还间接引用了"指令应该自行清理"来自the AngularJS documentation的最佳做法。
所以底线:一个常规$scope
对象最终会在其控制器执行时被销毁,并将其事件监听器与它一起使用(假设您没有做任何类型的循环引用,使其保持在范围内)。 $rootScope
永远不会死,因此永远不会释放它的事件处理程序。如果您的控制器正在向$rootScope
添加事件监听器,它应该删除控制器的$destroy
处理程序中的该处理程序。