我是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);
根本不会触发按键事件。有人能向我解释一下为什么会发生这种情况,以及如何使代码正常工作吗?非常感谢大家。
Backbone使用视图的delegateEvents
方法将jQuery delegate
调用绑定到视图的el
,该delegate
处理视图的所有事件。如果你这样做:
this.el = $(template).replaceAll(this.el);
你失去了绑定到this.el
的delegate
,你的事件也随之发生。你的this.$el
也会与this.el
不匹配,这也不好。更改视图的el
的正确方法是使用setElement
:
setElement
view.setElement(element)
如果要将Backbone视图应用于其他DOM元素,请使用setElement,它还将创建缓存的
$el
引用,并将视图的委派事件从旧元素移动到新元素。
所以你应该可以这样做:
this.setElement($(template).replaceAll(this.el));