2017-04-19 70 views
1

我創建了一個可以顯示多頁項目的列表模塊。我正在使用嵌套的ng-repeat遍歷頁面和每個頁面上的項目。不過,我注意到當我不斷刷新列表並加載新頁面和項目時,DOM節點在Chrome時間線工具中不斷增加,內存使用也在增加(我確保在錄製過程中單擊了垃圾收集按鈕,因此必須東西泄漏): Nodes Graph from Chrome Timeline角度1.5.x ng重複內存泄漏

我使用的角度1.5.5和requireJS,我聽說以前有內存泄漏NG-重複,但已經得到了修復1.4所支持代碼很簡單,我沒有在代碼中註冊任何DOM處理程序,我一直在這個問題上徘徊了一個星期,仍然無法弄清原因,現在我非常絕望,並且非常感謝幫助。

我的代碼文件的結構是這樣的:

list-container 
    |___module.js 
    | 
    |___controllers 
    |  |____list-container.js 
    | 
    |___directives 
    |  |____list-container.js 
    | 
    |___views 
      |____directive-list-container.html 

下面是代碼:

module.js

define([ 
    'angular', 
], function (angular) { 
    'use strict'; 

    return angular.module('ui.listContainer', []); 
}); 

列表container.js(指令)

define([ 
    'angular', 
    '../module', 
    '../controllers/list-container' 
], function (angular, module) { 
    'use strict'; 


    return angular 
    .module('ui.listContainer') 
    .directive('listContainer', function() { 
    return { 
     replace: true, 
     restrict: 'E', 
     templateUrl: '/modules/list-container/views/directive-list-container.html', 
     bindToController: {}, 
     scope: {}, 
     controllerAs: 'listVm', 
     controller: 'listContainerController' 
    }; 
    }); 
}); 

list-container.js(co ntroller)

define([ 
    'angular', 
    '../module' 
], function (angular, module) { 
    'use strict'; 
    angular.module('ui.listContainer').controller('listContainerController', ['$scope', function ($scope) { 

    var listVm = this; 

    $scope.refreshPage = function() { 
     if (listVm.list) { 
     listVm.list = null; //Clear the data 
     } 
     listVm.list = {}; 
     listVm.list.pages = feedData(); //Load mock data 
    }; 


    function feedData() { 
     var pages = []; 
     for(var i = 0; i < 10; i++) { 
     pages.push(new PageMock()); 
     } 
     return pages; 
    } 

    function PageMock() { 
     this.items = []; 
     for (var i = 0; i < 50; i++) { 
     this.items.push(new ItemMock()); 
     } 
    } 

    function ItemMock() { 
     this.id = Math.floor(Math.random() * 10000000); 
    } 

    }]); 
}); 

指令一覽container.html(視圖)

<div class="list-container row"> 
    <div id="list-container-pages"> 
     <div class="list-container-pages row"> 
      <div ng-click="refreshPage()">Refresh Page</div> 
      <div class="list-container-page row" ng-repeat="page in listVm.list.pages track by $index"> 
       <div class="row" ng-repeat="listItem in page.items track by listItem.id"> 
        <span class="col-md-12">{{listItem.id}}</span> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

我創建了一個plunker模仿我有上述代碼中,但是它不泄漏在所有在plunker示例,其是超級怪異的。 Plunker Example

回答

1

看起來像一個角度錯誤,看到其他職位。 AngularJS: Memory Leak with ng-repeat using custom objects (w/simple PLUNKR)

+0

該帖子引用了角度1.4.something,並且被認爲是固定的。雖然我似乎無法在實際的回購中找到提交,並且我在我所維護的某些角度爲1.5.8的代碼中看到了相同的行爲。 – hakon

+1

我正在使用angular 1.5,並且這種漸進式內存增加的行爲仍然存在。我最終定期定期刷新頁面作爲解決方法。 – user2217057

+0

使用angularjs 1.6.4,這仍然是一個工作周圍添加「跟蹤$索引」,如果你有一個ng重複(不適用於過濾器),並且每小時刷新一次頁面也可以幫助。 – AKMorris