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
处理程序中删除该处理程序。
我一直在玩 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
处理程序中删除该处理程序。