2012-09-01 70 views
2

我是Backbone的新手,尝试做一些示例,但我坚持使用这个示例。 我有以下骨干查看:骨干视图更改el属性时不会触发事件

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 = $(模板).replaceAll(this.el);

keypress事件根本没有被触发。 任何人都可以请向我解释为什么发生这种情况,以及如何使这段代码有效?非常感谢你。

回答

6

骨干网使用视图的delegateEvents方法绑定一个jQuery delegate调用视图的el,这delegate就是处理所有视图的事件。如果你这样做:

this.el = $(template).replaceAll(this.el); 

你失去了delegate绑定到this.el和您的活动去用它。你最后还会得到this.$el不符合this.el,那也不好。正确的方法来改变视图的el是使用setElement

setElementview.setElement(element)

如果你想用骨干视图适用于不同的DOM元素,使用setElement,这将还创建缓存的$el引用并将视图的委托事件从旧元素移动到新元素。

所以,你应该能够做到这一点是这样的:

this.setElement($(template).replaceAll(this.el));