骨干内存泄漏:总是在render()之前执行remove()

时间:2014-11-24 16:18:37

标签: javascript jquery backbone.js

我找到了一些资源,建议在显示另一个Backbone视图之前显式删除它。

还是这样吗?我是否应该在当前视图上调用remove(),如果我想导航到另一个路径并渲染另一个视图?

当我们在,当我做$('body')。html(...)时 - 'body'中的现有内容会发生什么,是否会被删除并收集垃圾?

2 个答案:

答案 0 :(得分:2)

这取决于你正在做什么。但作为一种好的做法,建议使用视图中的remove()方法。

如果您使用Backbone和jQuery,并且您没有绑定到模型/集合的侦听器,则不需要在渲染之前删除元素。

事实证明,如果您尝试使用jQuery替换元素内容,lib将处理子项,数据和关联事件删除。 jQuery的文档说:

  

.html()用于设置元素的内容时,该元素中的所有内容都将被新内容完全替换。此外,在使用新内容替换这些元素之前,jQuery会从子元素中删除其他构造(如数据和事件处理程序)。

但是如果你在视图和模型/集合之间绑定事件,你应该从骨干网做stopListening,或者这个事件将在你的骨干元素的事件堆栈中关联,直到你刷新你的相关模型/集合。

通过执行Backbone View remove方法,您将执行jQuery remove()和Backbone stopListening()

答案 1 :(得分:0)

这些观点背后的理论逻辑是,只要存在以下任一项,它们就是无法进行垃圾收集的对象:

  • 对DOM的引用,
  • 另一个对象,例如绑定到视图并侦听某些事件的模型。

根据您对@GabrielGartz答案的最后评论:

你之所以要调用jquery remove(),是因为它会删除对DOM的引用。 Afaik,Backbone使用jquery的on来听取与视图el及其子元素(这些事件冒泡)相关的事件。 jquery' s remove()清除这些DOM侦听器。

jQuery docs:

  

与.empty()类似,.remove()方法将元素取出   DOM。如果要删除元素本身,请使用.remove()   作为里面的一切。除了元素本身,所有   绑定事件和与元素关联的jQuery数据将被删除。   要删除元素而不删除数据和事件,请使用.detach()   代替。

DOM引用与Backbone View无关,因为对象将模型作为一个属性,使用listenTo来侦听可以从应用程序的其他部分广播的事件。

我希望这会有所帮助。