2012-02-21 65 views
14

如果我存储视图window.myView变量,渲染它,然后在JavaScript控制台呼叫:为什么关于替换html的Backbone事件不起作用?

$('#container').html('') 

,然后调用:

$('#container').html(window.myView.$el) 

绑定事件将停止工作。

我敢肯定,应该是这样,但:

  • 到底为什么是这样工作的?
  • 如何重新呈现无视事件绑定的视图子部分?
  • 为什么打电话myView.render()不会失去事件绑定?

更新:

找到this文章。这是原因吗?

确保jQuery是不卸载你的事件,当你不希望它

如果你是,你动态创建的意见和附加/删除它们的DOM建立一个应用程序,你可能有问题。每次从dom中删除视图,jQuery都会卸载所有事件。所以你不能引用一个视图并将其从dom中删除,然后再重新添加它。您的所有活动都将被卸载。如果你想保留观点,更好的办法是用display:none来隐藏它们。但是,你不应该滥用这个并回收一段时间内你不会使用的视图(并防止内存泄漏)。

+0

感谢您提出这个问题。我和Spine有类似的问题,根本无法弄清楚究竟发生了什么。 – 2013-03-28 20:16:38

回答

18

jQuery的emptyhtmlremove事件正在清理所有的jQuery的事件和数据绑定,以防止内存泄漏(你可以检查jQuery的源代码cleanData方法找出更多 - 这是一个无证法)

view.render()不会删除事件,因为Backbone视图事件使用事件委托绑定,并绑定到视图的el,而不是直接绑定到视图中的元素。

如果您想重用您的视图,您可以使用jQuery detach方法删除它们,该方法可以保持所有事件和数据绑定,但必须注意不要以这种方式产生内存泄漏。 (jquery detach docs

如果您想采用第一种方式,您总是可以使用Backbone.View delegateEvents方法轻松重新绑定Backbone事件。 (backbone doc

ps。它也更清洁和更优化使用jQuery .empty()而不是.html(''),因为jQuery html方法在插入新的html之前总是首先调用空来清理所有事件和数据。也绝不混合jQuery和本地DOM innerHTML,因为它可能产生内存泄漏导致未清理jQuery事件/数据

+1

调用'this。在视图中的delegateEvents()'像一个魅力一样工作。谢谢。 – 2012-11-06 22:50:36

+0

Hooray for .delegateEvents! – SimplGy 2013-05-23 02:18:14

+0

还要考虑在渲染父视图时拆除并重新创建所有子视图。 – 2015-02-03 16:12:24