我听说在控制器上使用rootscope $是一种不好的做法,因为当一个控制器被销毁时,事件监听器就不会。如果我从服务中使用它并将其注入控制器,如下所示,它是否会阻止内存泄漏?
.service("hiEventService",function($rootScope) {
this.broadcast = function() {$rootScope.$broadcast("hi")}
this.listen = function(callback) {$rootScope.$on("hi",callback)}
})
答案 0 :(得分:2)
我不认为这会阻止'内存泄漏,因为它永远不会在应用程序的生命周期内被破坏,因为每个偶数都在$rootScope
上注册。
最佳做法是在范围破坏时销毁侦听器。
例如,如果有一个控制器正在监听这样的事件,
$scope.$on('anEvent', function(){});
不需要销毁监听器,因为监听器将自动在范围销毁时自动取消注册。
另一方面,如果事件在$rootScope
上注册,
var eventHandle = $rootScope.$on('anEvent', function(){});
偶数可以(并且应该)通过在范围destroy上执行eventHandle
(这是一个函数)来销毁:
$scope.$on('$destroy', function(){
eventHandle();
});
此外,尽量避免在$rootScope
上播放活动。尝试在子范围上使用$emit
和$broadcast
。更多信息:$rootScope.$broadcast vs. $scope.$emit