Backbone中事件传播的奇怪问题。大多数人问如何阻止事件传播,但我很难让我的事件传播!!
这里我有两个View对象。MainView包含Item视图并侦听点击事件以调用run():
var MainView = Backbone.View.extend({
...
events: {
"click .item": "run" // works only if no click event in Item
},
render: {
// Item View object children
},
run: function() {
//run :)
}
});
项目视图对象也会监听自身的点击事件,以切换打开/关闭行为:
var Item = Backbone.View.extend({
...
events: {
"click" : "toggle" // MainView click event works when this is removed
},
toggle: function() {
this.model.toggle();
}
});
问题是单击Item时MainView.run()没有被激发,而它有一个Item.thoggle().的单击事件
但是,如果我删除Item.thoggle()click事件,MainView.run()将触发。这让我得出结论,在我无法控制的情况下,这一事件在某种程度上被迫停止传播。
我该如何解决这个问题?我是错过了一些显而易见的东西,还是这是不可避免的?
感谢您的任何建议和回答:)。
项目视图中的单击事件似乎没有绑定到特定的DOM对象。侦听通用单击事件可能会覆盖侦听特定.item单击事件的Backbone。尝试将ID或类名添加到项目视图单击事件中,以消除任何歧义。
var Item = Backbone.View.extend({
...
events: {
"click .some-class" : "toggle" // This should fix your problem
},
...
Jay B.Martin回答了这个问题。
问题是View调用this.model.thoggle();
toggle()函数设置MainView正在侦听的一些变量,从而引发render()事件。
当MainView调用render()时,Item视图依次被移除、渲染并添加到DOM中。这将使用事件丢失绑定到DOM元素的事件:{}。
相反,无论DOM中绑定到的元素的上下文/状态如何,都应该使用_.bind()或_.bindAll()来永久绑定事件。
原始评论答案:
@Dan0,对不起,我有点困惑,切换怎么会是你问题的根源。我认为这是绑定到嵌套视图中的隐式DOM元素所产生的上下文歧义的症状。调用toggle后,单击事件将丢失其最初绑定到的上下文(即this.el)。解决此问题的惯用方法是:a)传递一个显式元素,以便它可以在后续事件上重新绑定,或者b)使用_.bind或_.bindAll,以便单击事件在上下文更改时永久绑定到项视图。–周B.马丁8月10日23:46