【发布时间】:2014-07-18 04:35:06
【问题描述】:
我在使用自定义 DataTables 指令时遇到了很大的内存泄漏。该指令使用 Jquery 的 DataTables 插件,并且有一个函数会导致内存泄漏。
var rowCompiler = function(nRow, aData, iDataIndex) {
nRow = $compile(nRow)(scope);
}
如果我注释掉这个方法,那么我看不到泄漏。 rowCompiler 方法获取第一列并将 ID 替换为 id。这个专栏有两个指令,所以我需要使用 $compile 让 Angular 知道这些指令。我尝试过使用 scope.$on('$destroy', function() 但节点和内存不断增加。
下面是从数据表中渲染出来的 HTML。
<tr class="ng-scope odd">
<td class=""><ng-menu-drop ng-idr-id="630" class="ng-isolate-scope">
<div class="menu-drop">
<li class="dropdown" style="list-style:none;"> <a class="dropdown-toggle"><i class="icon-cog icon-large"></i> </a>
<ul class="dropdown-menu">
<li><a href="#/idr/630/profile/view">Profile</a></li>
<li></li>
<li> <a href="#/idr/630/documents">Documents</a></li>
<li><a href="#/idr/630/communication">Communication </a> </li>
<li><a href="#/idr/630/hierarchy/">Hierarchy </a></li>
</ul>
</li>
</div>
</ng-menu-drop>
</td>
<td class=""><div tooltip-placement="left" tooltip="test" class="ng-scope">test</div></td>
.directive('ngMenuDrop', [ function(scope, elm, attrs) {
return{
restrict:"E,A",
scope: {
ngIdrId: '@'
},
link: function (scope, element, attrs) {
},
template: '<div class="menu-drop"><li class="dropdown" style="list-style:none;"><a class="dropdown-toggle"><i class="icon-cog icon-large"></i> </a> ' +
' <ul class="dropdown-menu" ><li><a href="#/idr/{{ngIdrId}}/profile/view">Profile</a><li><li><a href="#/idr/{{ngIdrId}}/documents">Documents</a></li><li><a href="#/idr/{{ngIdrId}}/communication">Communication </a></li><li><a href="#/idr/{{ngIdrId}}/hierarchy/">Hierarchy </a></li></ul></li></div>'
}
}])
【问题讨论】:
-
让我们看看
nRow的 HTML 和两个指令的代码 -
我已经添加了渲染的 Html 和指令(它可能甚至不应该是指令),第二个指令是使用引导程序的工具提示指令。
标签: angularjs memory-leaks datatable compilation