2015-04-30 29 views
1

我encoutered的情況下一些香草偵聽器關閉範圍,如:查找孤兒範圍削減內存泄漏

$(window).on('click', function() { 
    $scope.doSomething(); 
}) 

這聽衆是沒有正確綁定,因此這$scope從來沒有垃圾收集。

由於它是一個非常大的Angular應用程序,我懷疑這可能發生在許多其他地方。

有沒有辦法讓內存中的所有範圍?僅僅從DOM元素中獲取它們是不夠的,因爲我想解決這個問題:元素已經被銷燬,範圍將$$destroyed屬性設置爲true,但它仍然在內存中。

如果沒有Angular的方式來獲取它,我留下了標準的Javascript分析,請讓我知道,我會刪除這個問題(因爲它可能成爲與標準內存泄漏檢測方法重複)。

+0

扮演惡魔的擁護者我會說真正的問題不在於內存泄漏,而是仍然活躍的事件處理程序。內存泄漏只是一個副作用。我想這一切都歸結於你最後的聲明。但我不會刪除這個問題。 – zeroflagL

回答

-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。在所有其他情況下,當父級作用域被銷燬時,此屬性需要設置爲 。

從這我明白,角實際上是摧毀你的父範圍,你可以看到$$銷燬設置爲true。

進一步研究範圍如何被銷燬。在$ destroy函數之前還有一條評論:

從父項 範圍中移除當前範圍(及其所有子項)。刪除意味着 調用{@link ng。$ rootScope.Scope#$ digest $ digest()}將不再傳播到當前作用域及其子級。刪除還意味着當前的 作用域有資格進行垃圾回收。

所以基於這個我會說只要你正確地銷燬你的範圍它應該不再存在並且不會造成任何內存泄漏。

+0

感謝您的關注,但是這不會阻止'$ scope'仍然在內存中,就像我給出的例子。事實上我不認爲'$ scope'在控制器(即控制器本身:即使清除'vm'的函數仍然存在)時也不會消失。當他們被徹底摧毀時,我對孤立的指令變得淡漠。 – floribon

+0

那麼我已經知道角度範圍的破壞。我的問題正是如何知道被銷燬的作用域已經*未*被垃圾收集,因爲它應該在用戶故障的特定情況下,我們仍然在一些函數或對象中引用它(如jQuery監聽器) – floribon