在底层,Backbone 使用 jQuery 的“委托”来连接事件。所以这不是“像”jQuery,而是 jQuery 为我们做的。
为了防止范围界定问题并确保我们的 View 事件仅适用于我们想要的 HTML/DOM 元素,所有 events 声明的范围都限定为 View 的 el。
当 Backbone 视图被实例化时,el 属性要么为您生成,要么由您分配。这使您有机会将视图附加到 DOM 的现有块或创建可以附加到 DOM 的新 HTML 块。
以下是附加到现有 DOM 的方法:
MyView = Backbone.View.extend({
// ...
});
var existingDomEl = $("#someElement");
new MyView({
el: existingDomEl
});
通过在实例化视图时指定el,或直接在视图定义中指定它,我们使用现有元素。
如果我们从构造函数选项和视图定义中省略el,Backbone 将为我们生成一个el。默认情况下,它会在视图实例化时在el 中生成一个div。
一旦一个视图拥有它的el,无论是通过生成还是赋值,视图的事件声明都通过jQuery委托,作用域为视图的el。
假设您有以下 html:
<div id="foo">
<button class="btnSay">Say!</button>
</div>
<div id="bare">
<button class="btnSay">Say, Part 2!</button>
</div>
使用您的示例视图,我们可以将视图分配给 foo 或 bar 元素,并且只有该元素中的按钮会获得点击事件。
var PersonView = Backbone.View.extend({
....
events : {
"click button.btnSay" : "saySomething"
},
saySomething : function(){
....
}
...
});
new PersonView({
el: $("#foo")
});
现在,当您单击 foo div 中的按钮时,您将触发 saySomething 回调。但由于 PersonView 的事件范围在该 PersonView 实例的 el 内,因此单击 bar 内的按钮将永远不会触发回调。