我遇到了一些香草听众正在关闭范围的情况,例如:
$(window).on('click', function() {
$scope.doSomething();
})
此侦听器未正确解除绑定,因此此$scope
从未被垃圾收集。
由于它是一个非常大的Angular应用程序,我怀疑它可能会在许多其他地方发生。
有没有办法让所有范围都在内存中?从DOM元素中获取所有内容是不够的,因为这正是我想解决的情况:元素已被破坏,范围将$$destroyed
属性设置为true,但它仍然在内存中。
如果没有Angular方法可以获得它并且我留下了标准的Javascript分析,请告诉我,我会删除这个问题(因为它可能会成为标准内存泄漏检测方法的重复)。
答案 0 :(得分:-1)
有很多方法可以解决这个问题,我个人在控制器中有类似的东西
angular.module('something').controller('someCtrl', someFunc);
function someFunc($injectables like $scope){
var vm = this;
vm.blah = ...;
....
//at the end
$scope.$on('$destroy', function(){
vm = null;
});
}
仔细查看angularjs.org网站上的代码,我在代码中找到了这条评论
当新范围未被隔离或我们继承
this
时,和 父范围被销毁,属性$$destroyed
被继承 prototypically。在所有其他情况下,需要设置此属性 当父范围被销毁时。
据我所知,angular实际上正在破坏你的父范围,你可以看到$$ destroyed设置为true。
进一步研究范围如何被摧毁。在$ destroy函数之前还有一个注释:
从父级移除当前范围(及其所有子级) 范围。删除意味着 调用{@link ng。$ rootScope.Scope#$ digest $ digest()}将不再 传播到当前范围及其子级。删除也意味着当前 范围有资格进行垃圾收集。
基于此我会说,只要你正确地破坏你的范围它就不应该存在并且不会导致任何内存泄漏。