2012-06-11 76 views
11

爲什麼我必須創建一個整體close prototype只是爲了讓我的事件從我的視野中解除?不應該骨幹只是建立在?有沒有辦法檢測視圖何時被刪除?主幹事件發射兩次

在我離開並回到視圖後,我的骨幹事件激發了兩次。

 events : { 
      "click #userDropdownButton > a" : "toggleUserDropdownMenu", 
      "click" : "hideUserDropdownMenuIfClickedOutside" 
     }, 

     el : "body", 

     initialize : function() { 
      this.render(); 
     }, 

     // Shows/hides the user dropdown menu 
     toggleUserDropdownMenu : function() { 
      if(!this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.showUserDropdownMenu(); 
      } else { 
       this.hideUserDropdownMenu(); 
      } 
      return false; 
     }, 
     showUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').addClass('hover'); 
      this.$el.find('#userDropdownButton > ul').show(); 
      this.$el.find('#userDropdownButton > a .arrow-down').removeClass('arrow-down').addClass('arrow-up'); 
     }, 
     hideUserDropdownMenuIfClickedOutside : function() { 
      if(this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.hideUserDropdownMenu(); 
      } 
     }, 
     hideUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').removeClass('hover'); 
      this.$el.find('#userDropdownButton > ul').hide(); 
      this.$el.find('#userDropdownButton > a .arrow-up').removeClass('arrow-up').addClass('arrow-down'); 
     }, 

第一次視圖顯示,下拉地打開和關閉,但在視圖渲染的第二次,下拉解釋每一個在打開時單擊兩次,從而爲不久,第二次點擊關閉它。

+1

如果我們知道你在做什麼,那麼我們可能會告訴你你做錯了什麼。也許如果有一些代碼要看... –

+0

@ muistooshort添加了代碼:)感謝您的反饋 – Garrett

+0

我會稱這是http://stackoverflow.com/q/10966440/479863的副本,或者至少答案几乎相同。 –

回答

14

更新2013年5月1日:骨幹0.9.9+增加了一些內置的功能,以方便容易對付德ZOMG問題(見View.removeStopListening);但你仍然需要通過調用其中一個來殺死殭屍。


爲什麼一定要我創建了一個全閉環原型只需要有從我的觀點unbinded我的事件?

Derick's article在報道這整個問題上很棒。但是我可以添加我的兩位數,解決你的「爲什麼」它沒有內置的問題。

由於Backbone事件委託的工作方式,如果視圖超出範圍,視圖將不會被垃圾收集事件綁定。這是因爲其綁定事件的對象 - 在綁定到Backbone對象事件的情況下的Backbone對象,或在「events」回調的情況下的DOM事件系統 - 保持對視圖的函數的引用。

不管你信不信,一些骨幹用戶依賴這種行爲,並期望視圖繼續自動響應像他們被告知要做的事件,即使他們完全超出了範圍。 (我已經看到了幾個這樣做的教程。)這假設你永遠不需要移除視圖,或者視圖可以響應事件並移除它自己,因爲你已經失去了任何引用,但IMO,創造和遺忘'功能是很好的,只要你明白其中的含義。

mu is too short對於UI事件提供了一個很好的觀點。從DOM中刪除el也應該刪除委派的事件。綁定到模型或集合事件或其他Backbone對象的事件(任何對象都可以擴展Backbone事件原型)都不能這麼說。您需要在您鏈接到的文章中關注Derick Bailey的建議,並在這些情況下手動關閉視圖。我不確定這是否與其他JS MVC框架相比是Backbone的弱點,我沒有深入嘗試其他的。

「有沒有辦法檢測視圖何時被刪除?」

不是直接的,我知道。但通常,無論哪個代碼移除視圖都應該清理事件綁定,如果需要的話。通常,在良好的MVC體系結構中,視圖可以在相應的模型或集合上設置事件觀察器,然後根據事件發生(例如,從相應模型中「移除」事件)自行移除清理。如果你想讓你的視圖被普遍「檢測」,一種方法是在你自己的視圖原型中重寫remove函數,並觸發一個可以被其他人觀察到的自定義事件。