2012-09-01 152 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)); 
相關問題