6

ng-include多くのデータレンダリングを行うさまざまなデータページを切り替えるために使用します。

ブラウザのメモリ使用量が増加し続け、決して元に戻らないことがわかりました。

コード

コードは非常に単純です。

HTML コード:

<body ng-controller="MainCtrl">
  <div>
    <button ng-click="url='nodata.html'">No data</button>
    <button ng-repeat="i in getNumArray(10)" ng-click="loadData(i)">Load data {{i}}</button>
  </div>
  <hr/>
  [{{url}}]
  <div ng-include="url"></div>
</body>

「データなし」ボタンと、さまざまなページをロードするための 10 個のデータ ボタンが表示されます。

角度コード:

app.controller('MainCtrl', function($scope) {
  $scope.url = "nodata.html";
  $scope.loadData = function(n) {
    $scope.url = "data" + n + ".html";
  }

  $scope.getNumArray = function(n) {
    var arr = [];
    for(var i =0;i<n;i++) {
      arr.push(i);
    }
    return arr;
  }
});

app.controller('DataCtrl', function($scope, $http){
  $http.get('data.json').success(function(data){
      $scope.data = data;
  })
});

そして、「dataN.html」ページ:

<div ng-controller="DataCtrl">
  <table ng-repeat="x in getNumArray(500)">
    <tbody>
      <tr>
        <td>{{data["key0"]}}</td>
        <td>{{data["key1"]}}</td>
        <td>{{data["key2"]}}</td>
        <td>{{data["key3"]}}</td>
        <td>{{data["key4"]}}</td>
        <td>{{data["key5"]}}</td>
        <td>{{data["key6"]}}</td>
        <td>{{data["key7"]}}</td>
        <td>{{data["key8"]}}</td>
        <td>{{data["key9"]}}</td>
      </tr>
    </tbody>
  </table>
</div>

「nodata.html」ページ:

<div>No data yet.</div>

そして「data.json」:

{
  "key0": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key1": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key2": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key3": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key4": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key5": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key6": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key7": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key8": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f",
  "key9": "sdf sdf sdf sdf sdf sdf sdf sdf sdf sd fds fds fsd fds fds fds fds fsd fds fds f"
}

ライブデモは次のとおりです。

http://plnkr.co/edit/KGZVXIBws1kthgN2bxEJ?p=preview

Chrome でライブ デモを開くと、初期化メモリの使用量が 100M 未満です。次に、「データの読み込み」ボタンをクリックすると、「データなし」ボタンをクリックして「nodata.html」を読み込んでも、すぐに 300M に成長し、フォールバックすることはありません。

それは正常ですか?メモリリークがありますか、ng-includeそれとも何か不足していますか? それとも、メモリ使用量は問題ないので、心配する必要はありませんか?

スクリーンキャスト

それを示すスクリーンキャストを作成しました:

ng-インクルード

4

2 に答える 2

2

Stackoverflowはバグを報告する場所ではありません。https://github.com/angular/angular.js/issuesで問題を提出し、そこで議論を続けてください。

ユースケースを単一のファイルに簡略化しました:http://plnkr.co/edit/Wm4YRsLGJUDqUcww2DQZ ?p = Preview

これが私が見つけたものです。

  1. Windowsでのみリークし、MacOSXではリークしません
  2. プランカーでのみリークします。プランカーの外で実行すると、正常に動作します。

プランカーの外で問題を再現できますか?

于 2013-03-12T17:11:59.397 に答える
2

バージョン 1.0.5 にアップグレードしてみてください。この問題はないようです。テンプレートに最上位の空白ノードがあると、1.0.3/4 でメモリ リークが発生したためだと思います。

于 2013-03-09T16:01:20.760 に答える