eslint警告解释

eslint warning interpretation

我一直在玩 ES6 和 angular,我正在使用 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

我的意思是我理解警告,但我在以前的 angular 项目中从未这样做过,我应该按照错误提示去做吗?为什么是needed/good实践?

eslint-plugin-angular 的文档参考 John Papa's angular styleguide,但我并没有在那里真正找到对这种情况的提及。

johnpapa styleguide 不仅没有提到这种情况,它实际上包括一个忽略 $rootScope.$on 的 return 的例子。然而,关于 one of the eslint-plugin-angular issues 的讨论稍微澄清了意图:

If a controller is registering a listener on $rootScope it should probably be manually destroyed in "$destroy" since root scope will outlive all the controllers. --davidmason

post 还间接引用了 the AngularJS documentation 中的 "Directives should clean up after themselves" 最佳实践。

所以底线:一个常规的 $scope 对象最终会在它的控制器销毁时被销毁,并带走它的事件侦听器(假设你没有做任何类型的循环引用来保持它在范围内). $rootScope 永不消亡,因此永远不会释放其事件处理程序。如果您的控制器正在向 $rootScope 添加事件侦听器,它应该在控制器的 $destroy 处理程序中删除该处理程序。