谁能解释一下backbone.js中的delegateEvents有什么作用?该文档没有帮助我理解。
我的确切用例是:
我有一个主视图 X 和一个内部视图 Y。它们工作得很好,但是如果我转到主视图 Z,然后返回到 X(重用,而不是重新创建),那么附加到 Y 子元素的事件就会丢失。delegateEvents 解决了这个问题,但我想了解原因。
谁能解释一下backbone.js中的delegateEvents有什么作用?该文档没有帮助我理解。
我的确切用例是:
我有一个主视图 X 和一个内部视图 Y。它们工作得很好,但是如果我转到主视图 Z,然后返回到 X(重用,而不是重新创建),那么附加到 Y 子元素的事件就会丢失。delegateEvents 解决了这个问题,但我想了解原因。
本质上,当您调用它时,它是 jQuery remove.remove()
函数的代理,该函数从 DOM 中删除元素,以及绑定到该元素的事件哈希中的所有关联事件。
Backbone 的 View 元素仍然包含.el
,但是在重新插入 DOM 时,jQuery 元素失去了所有绑定的侦听器。
有几个解决方案:
彻底销毁视图元素,包括用新的destroy方法解除所有模型/控制器事件的绑定(目前只在github,下个版本的Backbone会添加)并在回来时创建一个新的视图(而不仅仅是缓存和重新渲染) - 我的首选方法
创建一个方法(或扩展删除)以使用 jQuery 的detatch,它显然与 remove 相同,而不会丢失事件绑定 - 尚未完成,但似乎可以工作
调用.delegateEvents()
每个渲染 - 你现在正在做什么
希望这可以帮助。
delegateEvents 接受events: { ... }
视图实例的声明,并将指定的事件绑定到指定的 DOM 元素,并使用指定的回调方法来处理事件。
因此,渲染后的 DOM 树如下所示:
<div>
<a href="#" id="foo">foo</a>
</div>
和这样定义的视图:
Backbone.View.extend({
events: {
"click .foo": "fooClicked"
},
fooClicked: function(e){
// handle the click, here
},
render: function(){
// render the specified HTML, here
}
});
将正确处理单击“foo”链接,以便您可以响应代码中的单击。
声明的细分events
是:"eventname selector": "callback"
其中“eventname”是任何 DOM 事件,例如“click”。“选择器”是任何有效的 jQuery 选择器,它针对您的视图运行,el
以便将事件绑定到 DOM 元素。“回调”是该视图上要调用的方法的名称,当该 DOM 元素的事件触发时。
希望有帮助