概要
次の plunkr が $compile を実行するたびにメモリ リークを引き起こすのはなぜですか?
http://plnkr.co/edit/HhB4croPKuN5TP2NPqq6
コードの説明
HTML を完全に再レンダリングする必要がある場合があるディレクティブを作成しています。テンプレートを文字列として生成し、その文字列を $compile に送り、最後に jQuery を使用して古い DOM を削除し、新しくレンダリングされた要素に置き換えます。
これを行うたびに、アプリケーションは数メガバイトのメモリをリークし、ブラウザをクラッシュさせることがよくあります。Chrome ヒープのスナップショットは、切り離された DOM 要素のツリーが毎回追加されることを示していますが、何らかの理由で Plunkr にはこの問題はありません (ただし、依然として多くのリークが発生します)。
このメモリリークの原因は何ですか?
「なに?文字列テンプレートを生成して再コンパイル?なぜ?」
これは、明らかに Angular ディレクティブの記述方法ではありません。私の最初のアプローチは、ng-repeat と他の双方向バインディングを組み合わせることです。残念ながら、スコープの $watch-statements の数が増えると、パフォーマンスの問題が発生します。このアプローチを選択した理由について少し説明するために、ここで少し不満を述べます: AngularJS ではデータ バインディングはどのように機能しますか?
編集
私はプランクに取り組んできましたが、メモリリークはなくなりました。DOM を再コンパイルするための漏れのない方法として役立つと他の誰かが考えた場合に備えて、この質問は残しておきます。