eslint警告解释

时间:2015-10-12 12:40:16

标签: javascript angularjs eslint

我一直在玩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的文档,但我并没有真正发现这种情况。

1 个答案:

答案 0 :(得分:8)

johnpapa样式指南不仅没有提到这种情况,它实际上还包括一个忽略$rootScope.$on返回的例子。但是,关于one of the eslint-plugin-angular issues的讨论稍微澄清了意图:

  

如果控制器正在$rootScope上注册一个监听器,那么它应该在" $destroy"中被手动销毁。因为根范围将比所有控制器寿命更长。 - davidmason

该帖还间接引用了"指令应该自行清理"来自the AngularJS documentation的最佳做法。

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