使用区域

时间:2016-09-07 15:39:07

标签: javascript backbone.js marionette

我使用Marionette 3.0。

我有BlockView可能有不同数量的区域。 这些区域填充了BlockRegionViews,它们是CollectionViews(它们将在2.x中)并且这些视图渲染了更多的BlockView。 我想编写一个函数来创建一个BlockView,它的区域已经填充了(空)BlockRegionViews,而不是返回这个BlockView。

所以我写了这段代码:

var blockView = new BlockView({model: blockModel});
var regions = blockModel.get('regions')
for(var i in regions) {
    var blockRegionModel = regions[i];
    var blockRegionView = new BlockRegionView({model: blockRegionModel});
    blockView.addRegion(blockRegionModel.get('position'), '...regiondefinition...');
    var region = blockView.getRegion(blockRegionModel.get('position'));
    // This is the line where i get the error.
    region.show(blockRegionView);
}
return blockView;

当然我的代码很糟糕。即使是show function的名字也表明它对我来说不是正确的功能(因为我现在不想显示任何观点),但是我找不到类似的东西。这在文档中。

所以我的问题是:我应该如何构建一个视图,并在其区域中初始化其他视图而不渲染任何视图?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想在视图中渲染视图,而不是渲染任何东西,直到它们全部被初始化。

您的描述中的blockModel和区域处理有点令人困惑,所以我希望您可以将其应用到您的案例中。

围绕a View's lifecycle的文档很有帮助。

var ChildView = Mn.View.extend({..});

var ParentView = Mn.View.extend({
  template: //..,
  onBeforeRender: function() {
    this.showChildView('reg1', new ChildView({model: someModel}));
  },
  regions: {
    reg1: //..
  }
});

在上面的示例中,ChildView将被实例化,并在ParentView呈现之前附加到ParentView。但是,当呈现ParentView时,ChildViews将被实例化并在其区域中呈现。

你提到你不想渲染任何东西。这是一种罕见的情况,但您可以在任何渲染事件之外实例化子视图。

var ChildView = Mn.View.extend({..});

var ParentView = Mn.View.extend({
  template: //..,
  initialize: function() {
    this.childView = new ChildView({model: someModel});
  },

  // You can decide whenever you want to show the childView
  // and invoke this method.
  showTheChildView: function() {
    this.getRegion('reg1').show(this.childView);
  },

  regions: {
    reg1: //..
  }
});

希望我能正确理解你的问题。