2012-07-21 218 views
3

所以我发现我的应用程序在一些扩展使用后变得缓慢。特别是当我创建很多视图,每个项目都在一个长列表中。我曾经想过,通过view.remove()去除这些视图可以帮助解决问题,但是当它们从页面中移除时,我注意到Chrome的时间轴显示我的DOM节点数量不会减少。我添加的每个视图都会继续增加此计数。事实上,似乎减少此节点计数的唯一一件事情就是刷新页面。骨干删除视图和DOM节点

这感觉不对我,我觉得我搞砸了一些真正的基础,因为这个问题似乎与我的所有意见,并不仅仅是这些的发生。这些查看列表发生得更快,因为它们有很多。

有没有人有什么建议,我应该找什么?什么样的原因会导致这种行为?

我会提供代码,但我不知道会有什么帮助。

TL; DR - View.remove()是从页面移除的观点,但我的DOM节点计数继续走升不下来。

+0

您是否检查过它是否可以在其他浏览器中重现?可能是Chrome浏览器的Web检查器的一个错误。对于少于1200个Dom节点而言,这是完全正确的,当它超出您必须检查哪些视图不显示并立即将其删除时 – Deeptechtons 2012-07-21 05:24:19

+1

您的视图是否倾听任何模型或收集事件?这可能会导致在视图中通过'this.el'和'this。$ el'泄漏。 – 2012-07-21 05:31:45

+0

@Deeptechtons我希望我能够说这是一个Chrome检查器问题,但我很高兴确保最薄弱的环节正坐在这台电脑前。 ;-)注意,我想我应该澄清我的DOM元素正在被删除。像document.getElementsByTagName(“*”)。length这样的东西会导致适当的计数更改,具体取决于我添加还是删除视图。我使用Derick Baileys僵尸删除的想法,并且每个视图都有一个关闭的功能,即成功删除和解除绑定事件。所以我的事件下降了,意见也没有了(至少表面上)。但节点计数仍然存在。 – jmk2142 2012-07-21 05:44:47

回答

6

由于未正确清理视图而导致内存泄漏。

阅读:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

这:http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/

你需要做的不仅仅是呼吁您的看法.remove()。当您尝试关闭视图时,您需要正确销毁所有事件和其他绑定。执行此操作的常用方法是在视图中提供close方法,我在第一篇文章中对此进行了描述。

请务必仔细阅读从约翰尼大鹿注释上的第一篇文章,太。它指出了一个实施事件清理的好方法。

+0

感谢您的答案,但我认为亩解决了我的问题,在评论。其实,我甚至在讨论中提到了你和你的僵尸技巧。 :-)在这种情况下解决这个问题的礼仪是什么? 我还没有读过你链接的垃圾收集文章,所以很有用,就像你所有的文章一样。 – jmk2142 2012-07-22 22:05:47