AngularJs内存泄漏:即使被监视的元素被删除,范围$$观察者也会增加

我的AngularJs应用程序存在很大问题……

我从服务器加载HTML内容(自定义表单).
当然,加载的HTML包含一些ng-show,ng-click等…
所以,我在附加到我的页面之前编译它.
这很好用.

但是,每次我编译加载的HTML时,它都会在我的范围内添加更多的$$观察者(当然是ng-show观察者).

这里有一点演示/模拟:http://plnkr.co/edit/6sSazsFAugzE5XmcYkS7

我的问题:如果你点击数百次“加载一些”,那么$$观察者不会永远不会减少并导致内存泄漏.

我试图删除(),empty(),unbind()我的元素(链接),但$$观察者数组只是保持增长,永远不会被清理.

我该如何解决这个问题?我怎样才能清理无用的观察者或“无编译”?

谢谢你的帮助 !!!

最佳答案 由于新元素是从相同的范围和相同的元素编译的,因此永远不会删除观察者.

所有观察者在其范围被破坏时移除(范围.$destroy()),当元素被移除时会自动发生.但是,您的元素永远不会被删除,您不断用新节点替换它的HTML.

避免这种情况的一种干净方法是避免重新编译每个新链接,而是生成动态ng-repeat列表.

否则,如果要保留代码,可以在每次编译时为元素创建新范围.这样,当重新编​​译它时,前一个范围将被销毁并且其所有观察者都被删除.

你可以看到这里的行动.我所做的就是用范围替换范围.在编译调用中使用$new(),以便每次都为元素设置一个新的范围:

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

PS:这是一个我从未遇到的有趣的用例,它可以为Angular社区做出贡献:-)

点赞