为什么替换html的Backbone事件不起作用?

Arn*_*psa 14 jquery events backbone.js

如果我将视图存储在window.myView变量中,渲染它,然后在javascript控制台中调用:

$('#container').html('')
Run Code Online (Sandbox Code Playgroud)

然后打电话:

$('#container').html(window.myView.$el)
Run Code Online (Sandbox Code Playgroud)

绑定事件将停止工作.

我很确定应该如此,但是:

  • 为什么这样的方式呢?
  • 如何重新渲染视图的子部分而没有丢失事件绑定?
  • 为什么调用myView.render()不会丢失事件绑定?

更新:

找到这篇文章.这是什么原因?

确保jQuery不会在您不希望的情况下卸载事件

如果您正在构建一个应用程序,您可以在其中动态创建视图并将其附加/删除到dom,则可能会出现问题.每次从dom中删除视图时,jQuery都会卸载所有事件.因此,您无法引用视图并将其从dom中删除,然后再重新附加.您的所有活动都将被卸载.如果你想保持周围的观点,更好的想法是使用display:none来隐藏它们.但是,您不应滥用此功能并回收您暂时不会使用的视图(并防止内存泄漏).

Tom*_* Tu 18

jQuery的empty,htmlremove事件正在清理所有的jQuery的事件和数据绑定,以防止内存泄漏(你可以检查jQuery的源代码的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事件/数据