为什么在Backbone.js中第二次渲染后事件不触发?
Why are events not firing after the second render in Backbone.js?
我在Backbone.js中创建了一个应用程序,它有一个父视图和多个子视图。子视图包含它们侦听和执行功能的链接。
父视图存储所有子视图的列表。在渲染函数中,在计算完自己的html之后,它会执行以下操作:
$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
$('.children', this.el).append(this.views[i].render().el);
}
ANSWER:问题是我在渲染过程中创建链接。例如,在第一次渲染(从init调用)时,事件成功绑定到链接。但是,由于render的所有后续调用都将重新创建整个元素,因此新链接没有将处理程序绑定到它。这是通过添加this.delegateEvents()
到渲染
您可能正在使用jquery remove
函数从视图中删除子视图-它会自动删除绑定到元素(this.el)的所有事件-设置在events
对象中。你可以在渲染模板后使用this.delegateEvents()
方法在子视图的渲染中重新绑定在events
对象中设置的事件委托,或者使用jquery detach
方法代替从DOM中删除元素而不删除事件绑定(链接)。delegateEvents
方法是相当昂贵的,因此我建议detach
方法删除元素,你想重用,如果你是渲染子视图的长列表-无关紧要的,如果它只是几个视图。
另一种可能性是您设置了错误的events
对象-从提供的代码量很难判断,但我打赌是第一个
一个非常常见的挑战。对于将来发现这个问题的人,这里有一篇关于视图渲染的好文章:
http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/你只需要确保在.html()运行时调用delegateEvents来重新绑定子视图上的事件。由于Backbone的setElement已经调用了delegateEvents,一个快速的解决方案可能是这样的:
相关文章:
- '单击'事件在Backbone中消失.使用流沙后查看
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 将Backbone.View重新注入DOM,保留事件而不是创建新事件
- Backbone.js ModelBinder将默认事件更改为keyup
- 我应该如何在backbone.mariente中测试/监视此类事件
- 在 Backbone - 在 CoffeeScript 中触发和侦听不同类的事件
- 如何将参数传递给backbone.js中事件对象中绑定的函数
- 将Backbone事件与HTML5视频播放事件结合使用
- 单击文档时的Backbone JS事件
- Can-Backbone视图在一个html元素上有两个不同的事件
- Backbone.js事件未启动
- JS/Backbone/Chaplin 事件处理程序未触发
- 访问谷歌地图事件中的Backbone.View功能
- Backbone.view.extend:如何声明事件
- 点击事件未启动!(backbone.js)
- 在Backbone.js视图中拖动gabilly.js事件
- 在 Backbone 中,为什么我在执行 fetch() 时无法触发“重置”事件
- 当侦听器已附加到 Backbone.Model 事件时获得通知
- 如何连接来自不同文件的事件?Javascript/Backbone
- 简单事件backbone.js错误