2014-10-20 136 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