2012-05-24 23 views
10

在視圖remove()方法中調用undelegateEvents()是否是一種不好的做法?爲什麼它不被骨幹人士默認包括在內?一旦不再需要視圖就可以撤銷活動的最佳方式

我意識到我陷入了這麼多的綁定問題,當重新初始化視圖變量。儘管在創建新視圖時自動調用undelegateEvents(),但它試圖取消關閉新實例化視圖的事件,而不是前一個。因此,除非每次手動調用它,否則ghost事件回調仍然存在,並且搞砸了我的應用程序。

處理這個問題的最佳方法是什麼?

+0

相關? http://stackoverflow.com/questions/10429648/backbone-js-how-to-unbind-from-events-on-model-remove/10433015#10433015 – fguillen

+0

你是否在切換視圖時重新使用'el'而非創造新的? jQuery'delegate'綁定到視圖的'el'。 –

+0

@ muistooshort是的,我經常重複使用相同的DOM容器,並將其賦予視圖,而不是每隔一段時間創建一個新容器。這就是爲什麼刪除鬼回調至關重要 – preslavrachev

回答

5

在視圖remove()方法中調用undelegateEvents()是不好的做法嗎?

它,除非你實現你自己的remove()是沒有必要的,你不叫Backbone.View.remove()this.$el.remove()。這就是如果你使用jQuery,至少。在Backbone視圖上調用remove()將調用jQuery.remove(),它將無論如何將刪除所有DOM事件偵聽器。

我意識到我陷入瞭如此多的綁定問題,只是重新初始化視圖變量。

很多人似乎使用Backbone.Events喜歡它的某種魔力,他們並不需要經過清理,如:

var View = Backbone.View.extend({ 

    initialize : function (options) { 

    // `on()` or `bind()` 

    this.model.on('something', this.render, this); 

    } 

}); 

查看Delegating events to a parent view in Backbone

我的回答

您遇到的重影事件可能與Backbone事件而不是DOM事件有關嗎?

如果您保留模型對象但希望擺脫該視圖對象或其Backbone事件註冊,則必須執行view.model.off(null, null, this);。您必須解除您在任何外部對象上註冊的事件。如果你願意,你可以覆蓋Backbone.View.remove()並在那裏做,但默認情況下,該方法只是view.$el.remove()的簡寫。

相關問題