目前我在IE 11下运行角度代码时遇到问题。由于Angular渲染嵌套的ng-repeat非常慢(即使使用单向绑定),我想出了使用指令进行渲染的想法其他<td>
元素没有添加任何不必要的观察者。
我做了一个模拟我正在经历的问题的傻瓜。指令代码如下: https://plnkr.co/edit/MNtShl6iWGFoXBHP2jmM?p=preview
.directive('tdRenderer', function($compile, $filter) {
return {
restrict: 'A',
link: function(scope, element) {
var row = scope.row;
var htmlElements = '';
angular.forEach(row.rowData, function(column) {
var dataValue = $filter('typeFormatter')(column);
htmlElements += '<td class="nowrap" ng-click="dataTableController.rowClicked($index)">' + dataValue + '</td>';
});
htmlElements = $compile(htmlElements)(scope);
element.append(htmlElements);
}
};
});
我刚刚使用随机值来模拟通常通过REST服务加载的数据,并添加了一个过滤器,就像我在现实世界中所拥有的那样。
在IE开发工具中,我已经在REST调用之前和之后创建了堆快照,并且我可以告诉我正在正确清理堆。偶尔我会看到几个字节差异+/-但是总内存不断增加。
在我将“track by”子句添加到ng-repeat后,情况有所改善,如果关键数据没有改变,则内存停止增加。然后它可以非常愉快地进行轮询,如果来自服务器的数据没有改变,则总内存不会增加。在我的生产代码中,例如,当您对列进行排序时,数据是新的,然后每次加载新数据时我开始看到增加大约3MB。几个小时后,IE达到2GB的限制,然后通常会崩溃。数据量相当小 - 大约是30k,所以我不知道它为什么会增加3MB。
我还尝试在编译函数中重写此指令,并在pre函数中尝试将我的元素设置为null或编写.html('')以尝试清理,这两者都没有帮助。在这一点上,一切似乎都指向了tdRenderer指令。我甚至试图取出$ filter但我不知道我还能做些什么来确保清理和释放所有内容。
我在Chrome或FF中没有看到相同的行为。只是IE(Edge也受到影响)
任何建议都将不胜感激
答案 0 :(得分:1)
IE11和Edge中存在内存泄漏:
请注意,在调试时我注意到即使在www.google.com等页面上,内存也会一直增长。因此,为了验证问题,我一直在使用系统监视器进行测试,并在那里查看ram用于选项卡的内容。关闭选项卡将释放内存。
<强>参考强>