現在、IE 11で角度コードを実行しているときに問題が発生しています。Angularはネストされたng-repeatをレンダリングするのが非常に遅いため(片方向バインディングでも)不要なウォッチャーを追加することなく、他の<td>
要素をレンダリングするためにディレクティブを使用するという考えです。AngularディレクティブでIEで合計メモリが増加しています
私は経験している問題をシミュレートするためにplunkrを作成しました。下記の指令コード: 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);
}
};
});
I'veは普通にRESTサービスを介してロードされますデータをシミュレートするランダムな値を使用し、それは私が現実の世界に持っているものであるとして、フィルタを追加しました。
IEデベロッパーツールでは、RESTコールの前後でヒープスナップショットを作成しており、ヒープが正しくクリーンアップされていると伝えることができます。ときどき私はいくつかのバイトの違い+/-を見ているが、しかし、全体のメモリは増加を続けている。
ng-repeatに「track by」句を追加した後、キーデータが変更されていない場合はメモリが増加しなくなったという状況が改善されました。ポーリングは非常に楽しいものです。サーバーからのデータが変更されていない場合は、合計メモリーが増えません。たとえば、列をソートするときのプロダクションコードでは、データは新しくなり、新しいデータがロードされるたびに約3MBの増加が見られます。数時間後、IEは2GBの制限に達し、通常はクラッシュします。データの量はかなり少なく、約30kです。なぜ3MB増えているのかわかりません。
コンパイル関数とpre関数でこのディレクティブを書き直そうとしましたが、私の要素をヌルに設定しようとしましたが、クリーンアップしようとしても.html( '')を書き込んでいませんでした。この時点では、すべてがtdRendererディレクティブを指しているようです。私は$ filterを取り出そうとしましたが、すべてがクリーンアップされてリリースされることを保証するために何ができるのか分かりません。
ChromeまたはFFで同じ動作が表示されません。ただ、IE(エッジも影響を受けている)、一般的にメモリIE11に漏れやエッジがある任意の提案を大幅に