eslint警告解释

DeX*_*eX3 7 javascript angularjs eslint

我一直在玩ES6和角度,我eslint-plugin-angular用来验证我的javascript.我有以下服务:

export function runBlock ($rootScope, $state, $log) {
  'ngInject';

  $rootScope.$on( '$stateChangeStart', function(event, toState) {
    // ...
  } );
Run Code Online (Sandbox Code Playgroud)

但是eslint给我以下错误:

The "$on" call should be assigned to a variable, in order to be
destroyed during the $destroy event
Run Code Online (Sandbox Code Playgroud)

我的意思是我理解这个警告,但是我在以前的角度项目中从未这样做过,如果我做了错误建议的话?为什么需要/良好实践?

这篇文章可供eslint-plugin-angular参考John Papa的角度风格指南,但我并没有真正提到这种情况.

Pal*_*tim 8

johnpapa风格指南不仅没有提到这种情况,它实际上还包括一个忽略回归的例子$rootScope.$on.然而,关于其中一个eslint-plugin-angular问题的讨论澄清了一点意图:

如果控制器正在注册一个监听器,$rootScope则可能应该在" $destroy"中手动销毁,因为根作用域将比所有控制器寿命更长.- davidmason

该帖子还间接引用了AngularJS文档中的"指令应该自行清理"的最佳实践.

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