我是Backbone的新手并试图做一些例子,但我坚持这个。 我有以下BackBone视图:
CommentBoxView = Backbone.View.extend({
initialize: function () {
this.render();
},
render: function () {
var template = _.template( $("#comment_box_template").html(), {} );
this.el.html(template);
},
events: {
"keypress textarea": "doKeyPress"
},
doKeyPress: function (event) {
console.log(event);
}
});
一切正常,但如果我更换
this.el.html(模板);
用这个:
this.el = $(template).replaceAll(this.el);
按键事件根本没有被触发。 任何人都可以向我解释为什么它发生以及如何使这个代码有效?非常感谢你们。
答案 0 :(得分:6)
Backbone使用视图的delegateEvents
方法将jQuery delegate
调用绑定到视图的el
,此delegate
处理所有视图的事件。如果你这样做:
this.el = $(template).replaceAll(this.el);
你失去了delegate
与this.el
的约束,你的事件就随之发生了。您最终还会得到this.$el
不匹配的this.el
,这也不好。更改视图el
的正确方法是使用setElement
:
setElement
view.setElement(element)
如果您想将Backbone视图应用于其他DOM元素,请使用 setElement ,这也将创建缓存的
$el
引用并从旧视图移动视图的委派事件元素到新的。
所以你应该能够这样做:
this.setElement($(template).replaceAll(this.el));