2012-02-21 74 views
14

如果我存儲視圖window.myView變量,渲染它,然後在JavaScript控制檯呼叫:爲什麼關於替換html的Backbone事件不起作用?

$('#container').html('') 

,然後調用:

$('#container').html(window.myView.$el) 

綁定事件將停止工作。

我敢肯定,應該是這樣,但:

  • 到底爲什麼是這樣工作的?
  • 如何重新呈現無視事件綁定的視圖子部分?
  • 爲什麼打電話myView.render()不會失去事件綁定?

更新:

找到this文章。這是原因嗎?

確保jQuery是不卸載你的事件,當你不希望它

如果你是,你動態創建的意見和附加/刪除它們的DOM建立一個應用程序,你可能有問題。每次從dom中刪除視圖,jQuery都會卸載所有事件。所以你不能引用一個視圖並將其從dom中刪除,然後再重新添加它。您的所有活動都將被卸載。如果你想保留觀點,更好的辦法是用display:none來隱藏它們。但是,你不應該濫用這個並回收一段時間內你不會使用的視圖(並防止內存泄漏)。

+0

感謝您提出這個問題。我和Spine有類似的問題,根本無法弄清楚究竟發生了什麼。 – 2013-03-28 20:16:38

回答

18

jQuery的emptyhtmlremove事件正在清理所有的jQuery的事件和數據綁定,以防止內存泄漏(你可以檢查jQuery的源代碼cleanData方法找出更多 - 這是一個無證法)

view.render()不會刪除事件,因爲Backbone視圖事件使用事件委託綁定,並綁定到視圖的el,而不是直接綁定到視圖中的元素。

如果您想重用您的視圖,您可以使用jQuery detach方法刪除它們,該方法可以保持所有事件和數據綁定,但必須注意不要以這種方式產生內存泄漏。 (jquery detach docs

如果您想採用第一種方式,您總是可以使用Backbone.View delegateEvents方法輕鬆重新綁定Backbone事件。 (backbone doc

ps。它也更清潔和更優化使用jQuery .empty()而不是.html(''),因爲jQuery html方法在插入新的html之前總是首先調用空來清理所有事件和數據。也絕不混合jQuery和本地DOM innerHTML,因爲它可能產生內存泄漏導致未清理jQuery事件/數據

+1

調用'this。在視圖中的delegateEvents()'像一個魅力一樣工作。謝謝。 – 2012-11-06 22:50:36

+0

Hooray for .delegateEvents! – SimplGy 2013-05-23 02:18:14

+0

還要考慮在渲染父視圖時拆除並重新創建所有子視圖。 – 2015-02-03 16:12:24