2014-10-20 135 views
1

我正在嘗試使用Marionete模塊來使用Backbone。Backbonejs Marionettejs殭屍視圖

例如。像David Sulc在「contact manager」應用程序中完成的「加載微調器」一樣,Firefox的「backboneye」插件在「微調器」被內容取代之後向我顯示「殭屍視圖」。它是「真正的」殭屍,因爲它具有「isDestroyed:true」屬性?

ps of the dom of the zombie

而且根據Chrome的插件 「Backbone debugger」 的觀點已被刪除

enter image description here

我應該擔心嗎?

這裏是控制器:

define(["app", "apps/items/itemsView"], function(app, View){ 
    app.module("ItemsApp.List", function(List, app, Backbone, Marionette, $, _){ 
    List.Controller = { 
     listAllItems: function(){ 
     require(["common/views", "entities/items"], function(CommonViews){ 

      var loadingView = new CommonViews.Loading(); 
      app.main.show(loadingView); 

      var fetchingItems = app.request("items:entities"); 
      var itemsPageLayout = new View.Layout(); 
      var panelView = new View.Panel(); 

     $.when(fetchingItems).done(function(items){ 
      var allItemsView = new View.Items({collection:items}); 

      itemsPageLayout.on("show", function(){ 
       itemsPageLayout.panelRegion.show(panelView); 
       itemsPageLayout.itemListRegion.show(allItemsView); 
      }); 
     app.main.show(itemsPageLayout); 
     }); 
     }); 
    } 
    } 
}); 
return app.ItemsApp.List.Controller; 
}); 

回答

0

你可能沒有一個殭屍視圖。

如果您main區域使用默認Marionette Region type和你的意見,從木偶視圖類型(ItemViewCollectionViewCompositeViewLayout)繼承,木偶確保殭屍視圖是可以避免的。

當一個視圖被換出一個區域(當您撥打app.main.show(itemsPageLayout)時會發生這種情況),微調視圖元素將從DOM中刪除,並且所有listenTo風格的事件處理程序都會解除綁定。

您可以在code for Region._destroyView,這就是所謂的show看到這一點:

_destroyView: function() { 
    var view = this.currentView; 

    if (view.destroy && !view.isDestroyed) { 
    view.destroy(); 
    } else if (view.remove) { 
    view.remove(); 
    } 
}, 

木偶View類型都有一個destroy方法處理移除視圖的DOM元素和解除綁定的事件處理程序(也被綁定listenTo - 解除與on綁定的事件並不那麼簡單)。基於vanilla Backbone.View而不是Marionette類型的視圖必須解除綁定自己的事件處理程序。未能正確執行此操作是殭屍視圖的主要原因。通過使用Marionette Views,你受到保護。

如果您使用覆蓋Region.show的自定義Region類型,則需要確保它在正在交換的視圖上調用destroy