2014-11-24 43 views
1

我发现了一些资源,建议在渲染另一个主体视图之前显式删除主干视图。主干内存泄漏:始终在render()之前执行remove()

现在还是这样吗?我应该在当前视图上调用remove(),如果我想导航到另一个路线并呈现另一个视图?当我在at时,当我做$('body')。html(...) - 'body'中的现有内容会发生什么时,它会被删除并被垃圾收集吗?

+1

是的,你应该调用'remove',这就是所有视图的清理应该在哪里。检查[jQuery文档](http://api.jquery.com/html/#html2)以查看$('body')。html(...)将执行什么操作。 – 2014-11-24 17:31:20

回答

2

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

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

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

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

但如果你绑定您的视图和模型/集之间的事件,你应该从骨干做stopListening,或该活动将在你的骨干分子的事件堆栈,直到您刷新相关的模型/收集相关。

通过执行骨干视图remove方法,您将执行jQuery remove()和Backbone stopListening()

+2

现货。非常感谢,正是我想知道的。有点奇怪,尽管我看到了很多不执行remove()的代码,尽管视图中有listenTo。 – Yaro 2014-11-25 00:54:44

0

这些观点背后的理论逻辑是,它们是不能被垃圾收集只要有任一对象:

  • 甲参照DOM,
  • 另一个目的,诸如模型,该模型绑定到视图并监听某些事件。

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

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

jQuery的文档:

类似于.empty()时,卸下摆臂()方法接受元件出 DOM的。使用一个.remove()时,你要删除的元素本身,以及 因为它里面的一切。除了元素本身,所有 结合事件和与该元件相关联的jQuery数据被去除。 要删除的要素而不除去的数据和事件,使用.detach() 代替。

的DOM引用是从骨干查看无关,作为一个对象会采取一个模型作为使用listenTo听,可以从应用程序的其他部分广播事件的属性。

我希望这会有所帮助。