重复使用自定义对象(带简单的PLUNKR)
(简单的plunkr演示在这里)
概要:
在第二次迭代遍历像这样的自定义对象的“数组”之后,有一个使用ng-repeat的泄漏:
<div ng-repeat="d_sampleObject in mySampleObjects">
{{d_sampleObject.description}}
</div>
内存配置文件显示一个额外的'd_sampleObject'遗留下来,而不是被解除引用。 下面详细介绍(通过控制器和注入服务)。 提供的plunkr链接也是一个简单的演示。 任何想法和帮助提前非常感谢!
注意: 'mySampleObjects'是以下实例的数组:
ml.MySampleObject = function (id) {
this.id = id;
this.description = 'this is object #:' + ' '+id;
}
细节:
我有一个自定义对象模型,它反映了我们在AngularJS应用程序中使用的业务领域对象。 我发现,当我将一个自定义对象的实例传递给ng-repeat时,引用被保留(我认为是通过Angular),并且内存不会被释放。 这发生在ng-repeat的第二个'wave'(点击'refresh'),因为它再次遍历它的对象数组。 这个泄露在我的个人资料测试(在Chrome中)中公开。 这是一个简单的例子。 点击“刷新”按钮一次(或多次)查看泄漏的额外'd_sampleObject'对象实例(在Chrome Profile Inspection中)。 请注意,'d_sampleObject'名称仅在传递给ng-repeat时使用。 我已经包含了下面进一步泄漏的额外对象实例('d_sampleObject')的屏幕截图。 为什么会有泄漏,怎么能避免?
(注意,我发现如果我不通过一个对象迭代我的对象集合(JS数组),而是通过一个原始索引('整数'),没有泄漏。泄漏似乎只发生在我使用作为ng-repeat迭代结果的对象引用)
简单的HTML:
<!DOCTYPE html>
<html ng-app="memoryleak">
<head>
<meta charset="utf-8" />
<title>Memory Leak Test</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.13/angular.min.js" data-semver="1.3.13"></script>
<script src="app.js"></script>
<script src="dataservice.js"></script>
</head>
<body ng-controller="MainCtrl">
<div ng-repeat="d_sampleObject in mySampleObjects">
{{d_sampleObject.description}}
</div>
<br>
<button ng-click="redo()">Number of refreshes: {{numRedos}}!</button>
</body>
</html>
简单的APP.JS
(function(ml) {
var app = angular.module('memoryleak',['servicemodule']);
app.controller('MainCtrl', ['$scope', 'dataservice', function($scope, dataservice) {
$scope.redo = function () {
$scope.numRedos++;
$scope.mySampleObjects = dataservice.myObjectCollection;
dataservice.redo();
}
$scope.redo();
}]);
}(window.MEMLEAK = window.MEMLEAK || {}));
SIMPLE dataservice.js
(function(ml) {
'use strict';
var serviceModule = angular.module('servicemodule',[]);
serviceModule.factory('dataservice', ['$rootScope', '$http',
function ($rootScope, $http) {
this.myObjectCollection = [];
this.redo = function () {
this.numRedos++;
// that.myObjectCollection = [];
this.myObjectCollection.length = 0;
for (var i = 0; i < 10; i++) {
var sampleObject = new ml.MySampleObject(i);
that.myObjectCollection.push(sampleObject);
}
sampleObject=null;
}
ml.MySampleObject = function (id) {
this.id = id;
this.description = 'this is object #:' + ' '+id;
}
return this; //return the entire service to make methods accessible to dependents
}]);
}(window.MEMLEAK = window.MEMLEAK || {}));
SCREENSHOT 1 :(第一页加载 - 创建了10个'mySampleObjects') SCREENSHOT 2 :(点击刷新 - 有第11个mySampleObject创建/泄漏,并引用传递给ng-repeat的'd_sampleObject'的实例名称。)
AngularJS人士承认,这确实是框架中的一个错误。 修复和拉取请求已发布。
我也问过正式修复的时间是什么。
链接地址: http://www.djcxy.com/p/83865.html