概括
为什么每次 $compile 运行时以下 plunkr 都会导致内存泄漏?
http://plnkr.co/edit/HhB4croPKuN5TP2NPqq6
代码说明
我正在编写一个有时需要完全重新呈现其 HTML 的指令。它通过将其模板生成为字符串,然后将该字符串提供给 $compile,最后使用 jQuery 删除旧的 DOM 并将其替换为新呈现的元素来实现这一点。
每次执行此操作时,应用程序都会泄漏几兆字节的内存,通常会使浏览器崩溃。Chrome 堆快照显示每次添加一个分离的 DOM 元素树,但 Plunkr 出于某种原因没有这个问题(尽管它仍然泄漏很多)。
我做错了什么导致此内存泄漏?
“什么?生成字符串模板并重新编译?为什么?”
我知道,这显然不是 Angular 指令的编写方式。我的第一种方法是将 ng-repeats 与其他双向绑定相结合。不幸的是,随着范围内 $watch 语句数量的增加,这会导致性能问题。关于我为什么选择这种方法的一些原因,我在这里稍微吐槽一下:数据绑定在 AngularJS 中是如何工作的?
编辑
我一直在研究 plunk,它不再泄漏内存。我会保留这个问题,以防其他人发现它可用作重新编译 DOM 的不泄漏方法。