在我看来,我没有声明this.el,因为我以动态方式创建它,但这样事件就不会发生。
这是代码:
查看1:
App.Views_1 = Backbone.View.extend({
el: '#content',
initialize: function() {
_.bindAll(this, 'render', 'renderSingle');
},
render: function() {
this.model.each(this.renderSingle);
},
renderSingle: function(model) {
this.tmpView = new App.Views_2({model: model});
$(this.el).append( this.tmpView.render().el );
}
});
观看2:
App.Views_2 = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render');
},
render: function() {
this.el = $('#template').tmpl(this.model.attributes); // jQuery template
return this;
},
events: {
'click .button' : 'test'
},
test: function() {
alert('Fire');
}
});
});
当我点击“.button”时,没有任何反应。 感谢;
答案 0 :(得分:20)
在render()方法结束时,您可以告诉骨干使用delegateEvents()重新绑定事件。如果你没有传入任何参数,它将使用你的事件哈希。
render: function() {
this.el = $('#template').tmpl(this.model.attributes); // jQuery template
this.delegateEvents();
return this;
}
答案 1 :(得分:1)
从Backbone.js v0。9。0(2012年1月30日)开始,有一个setElement方法来切换一个views元素并管理事件委托。
render: function() {
this.setElement($('#template').tmpl(this.model.attributes));
return this;
}
Backbone.View setElement: http://backbonejs.org/#View-setElement
setElementview.setElement(element)
如果您想将Backbone视图应用于其他DOM元素,请使用 setElement,它还将创建缓存的$ el引用并移动 视图的委托事件从旧元素到新元素。
以这种方式动态创建视图有其优点和缺点:
<强>优点:强>
缺点: - 这些几乎可以忽略不计
setElement
将从该列表中获取第一个元素并丢弃其余元素。
setElement
并确保传入的element.length === 1
。