Backbonejs Marionettejs僵尸的观点

时间:2014-10-20 08:46:06

标签: javascript backbone.js marionette

我正在尝试使用Marionete模块使用Backbone。

例如。实施"加载微调器"正如在" contact manager" David Sulc的应用程序," backboneye" Firefox的插件显示我" Zombie View"在" Spinner"之后已被内容所取代。是真的"真实的"它拥有的僵尸" 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;
});

1 个答案:

答案 0 :(得分:0)

你可能没有Zombie视图。

如果您的main地区使用默认Marionette Region type,您的观点会继承自Marionette视图类型(ItemViewCollectionViewCompositeView,{{1} }),Marionette确保避免使用僵尸视图。

当视图被移出一个区域时(当你调用Layout时会发生这种情况),spinner视图元素将从DOM中删除,所有app.main.show(itemsPageLayout) - 样式的事件处理程序都不会被绑定。

您可以在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();
  }
},

Marionette View类型有一个destroy方法,用于处理删除View的DOM元素和解除绑定的事件处理程序(与listenTo绑定 - 解除绑定的事件并不简单on)。基于vanilla Backbone.View而不是Marionette类型的视图必须取消绑定自己的事件处理程序。无法正确执行此操作是Zombie Views的主要原因。通过使用木偶视图,您将受到保护。

如果您使用覆盖Region的自定义Region.show类型,则需要确保它在正在换出的视图上调用destroy