7

我一直在玩 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

我的意思是我理解这个警告,但我在以前的角度项目中从来没有这样做过,我应该按照错误提示做吗?为什么需要/良好的做法?

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

4

1 回答 1

8

johnpapa 样式指南不仅没有提到这种情况,它实际上包括了一个忽略$rootScope.$on. 但是,关于eslint-plugin-angular 问题之一的讨论稍微澄清了意图:

如果一个控制器正在注册一个监听器,$rootScope它可能应该在“ $destroy”中手动销毁,因为根范围将超过所有控制器。——大卫梅森

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

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

于 2015-10-12T14:31:39.490 回答