为什么替换html的Backbone事件不起作用?
如果我在window.myView
变量中存储视图,渲染它,然后在javascript控制台中调用:
$('#container').html('')
然后打电话:
$('#container').html(window.myView.$el)
绑定事件将停止工作。
我很确定应该这样,但是:
- 为什么这样的方式呢?
- 如何重新渲染视图的子部分没有丢失事件绑定?
- 为什么调用
myView.render()
不会丢失事件绑定?
更新:
找到这篇文章。 这是什么原因?
确保jQuery不会在您不希望的情况下卸载事件
如果您正在构建一个应用程序,您可以在其中动态创建视图并将其附加/删除到dom,则可能会出现问题。 每次从dom中删除视图时,jQuery都会卸载所有事件。 因此,您无法引用视图并将其从dom中删除,然后再重新附加。 您的所有活动都将被卸载。 如果你想保持周围的观点,更好的想法是使用display:none来隐藏它们。 但是,您不应滥用此function并回收您暂时不会使用的视图(并防止内存泄漏)。
jQuery为empty
, html
和remove
事件正在清理所有jquery事件和数据绑定以防止内存泄漏(你可以检查jQuery源代码以cleanData
更多的cleanData
方法 – 这是一个未记录的方法)
view.render()
不会删除事件,因为Backbone视图事件是使用事件委托绑定的,并且绑定到视图的el
而不是直接绑定到视图中的元素。
如果要重用视图,可以使用jQuery detach
方法删除它们,这样可以保留所有事件和数据,但必须注意不要以这种方式产生内存泄漏。 ( jquery detach docs )
如果你想采用第一种方式,你可以使用Backbone.View delegateEvents
方法轻松地重新绑定Backbone事件。 ( 骨干文件 )
PS。 使用jQuery .empty()
而不是.html('')
也更干净,更优化,因为jQuery html方法总是先调用空,以便在插入新的html之前先清理所有事件和数据。 也永远不要混合使用jquery和本机DOM innerHTML,因为它可能会导致内存泄漏导致未清理jQuery事件/数据