2011-11-29 55 views
12

我在Backbone.js中創建了一個具有父級和多個子級視圖的應用程序。子視圖包含他們收聽並執行功能的鏈接。爲什麼Backbone.js中的第二次渲染之後事件不會觸發?

父級存儲所有子級視圖的列表。在渲染功能,是做計算自己的HTML後,它執行以下操作:


$(this.el).html(html); 
for (var i = 0; i < this.views.length; i++){ 
    $('.children', this.el).append(this.views[i].render().el); 
} 

答:這個問題是我在創造過程中呈現的鏈接。即在第一個渲染(從init調用的)上成功綁定到鏈接的事件。但是,由於所有後續渲染調用都會重新創建整個元素,因此新鏈接沒有綁定處理程序。這是通過@湯姆塗液解決

回答

13

您可能正在使用jQuery remove功能某處刪除視圖中的子視圖添加this.delegateEvents()到渲染的 - 它會自動刪除綁定的元素(this.el)的所有事件 - 設置在events對象中。在渲染模板以重新綁定events對象中設置的事件代表後,您可以使用this.delegateEvents()方法呈現子視圖,或者使用jquery detach方法代替DOM中的元素,而不移除事件綁定(link)。 delegateEvents方法是相當昂貴的,因此我建議您使用detach方法來刪除要複用的元素,如果您要渲染長列表的子視圖 - 無關緊要,如果只是幾個視圖。

其他的可能性是,你已經設置了events對象錯誤 - 很難從提供的代碼量中知道,但我敢打賭第一個。

+0

更增添了幾分細節,希望它有助於 –

+0

這是一個很好的想法,但我增加了刪除上面的代碼。此外,事件不會被設置錯誤,或者它不會首先被觸發。 – chacham15

7

一個非常普遍的挑戰。對於這個問題的未來發現者,這裏是關於視圖呈現一個偉大的文章:

你只需要確保delegateEvents被稱爲重新綁定在你的子視圖事件的任何時間的.html()運行。而且,由於骨幹setElement調用delegateEvents則已,一快速的解決方案看起來是這樣的......

http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/

+0

這正是我正在尋找的。謝謝! –

相關問題