我正在尝试添加一个BaseView
为我的模块中的所有主干视图执行一些初始化。
这是一个小提琴,代码在下面复制
创建一个自定义 BaseView 并让它订阅调度程序上的“关闭”事件。让它成为所有儿童创作的一部分。
var dispatcher = _.clone(Backbone.Events);
var ctor = Backbone.View;
var BaseView = Backbone.View.extend({
//override Backbone's constructor
constructor: function(options) {
ctor.apply(this, arguments);
dispatcher.on('close', this.close, this);
},
close: function() {
console.log(this.cid);
}
});
//Is this really needed??
BaseView.prototype.constructor = Backbone.View;
创建继承自 BaseView 的子视图:
var View = BaseView.extend({
el: '#clickholder',
initialize: function() {
_.bindAll(this);
},
//Events not bound?
events: {
"click #clicker": "clicked"
},
//never called :(
clicked: function(e) {
alert("clicked button");
}
});
new View();
这是HTML:
<div id="clickholder">
<button id="clicker">Clicker</button>
</div>
问题:如果单击按钮,则永远不会触发事件并且永远不会显示警报。我不确定问题是什么。我已经花了很长时间,但无法理解为什么events
不绑定到View
? 我究竟做错了什么?
PS:这是基于这里的答案。我专门创建了一个 BaseView 类,以便不会对我的应用程序中的所有主干视图产生全局影响,而只是将其限制在特定模块中
更新:根据@mu下面的答案修复小提琴。将按钮包装在 div 中似乎也不能解决问题。为了简化,我错误地将视图直接绑定到按钮。在我的主应用程序中,按钮位于视图的 el 中,因此在上述 BaseView 到位之前,委派工作得很好。