在Marionette区域显示Backbone Collection元素

时间:2014-02-19 11:03:50

标签: layout backbone.js requirejs marionette region

我有一个Backbone应用程序正在运行并且正常使用requirejs。现在,我正在尝试迁移到Marionette,以便更好地组织代码。

我只是想从一个区域的集合中显示一个模型,在另一个区域中有两个按钮。我想从该系列转到下一个或上一个型号。并改变其对模型区域的看法。

但我不知道如何迭代集合并将其模型发送到视图。

jsfiddle在这种情况下使用了一些简化的代码。

HTML:

<div class="player"></div>

<script id="layout-template" type="text/template">
    <div class="modelView"></div>
    <div class="controls"></div>
</script>
<script id="model-region" type="text/template">
    <%=name%>
</script>
<script id="control-region" type="text/template">
    <button id="prev">Prev</button>
    <button id="next">Next</button>
</script>

2 个答案:

答案 0 :(得分:1)

如果我理解您的问题,那么您正尝试在同一布局上协调两个视图之间的事件。在这种情况下,我建议设置一个Controller

然后,您可以在控件视图中注册视图triggers

ControlsView = Backbone.Marionette.ItemView.extend({
  // ...

  triggers: {
    "click #previous": "control:previous",
    "click #next": "control:next"
  }
});

然后在控制器中,您将实例化视图并为controlView触发器设置处理程序以更新modelView。

var Router = Marionette.AppRouter.extend({
  appRoutes: {
      "/": "start",
      "/:index" : "showModel"
  },
});

var Controller = Marionette.Controller.extend({

  initialize: function(){
    var self = this;
    this.controlsView = new ControlsView();
    this.modelView = new MainView();
    this.myCollection = new MyCollection();
    this.myIndex = 0;
    this.myCollection.fetch().then(function(){
      self.myIndex = 0;
    });
    this._registerTriggers();
  },
  start: function(){
    this.controlLayout.show(this.controlView);
    this.showModel();
  },
  showModel: function(index){
    index = index || this.index;
    this.modelView.model = myCollection.at(this.index);
    this.modelLayout.show(this.modelView);
  },
  showNext: function(){
    var max = this.myCollection.models.length;
    this.index = max ? 1 : this.index + 1;
    this.showModel();
  },
  showPrevious: function(){
    var max = this.myCollection.models.length;
    this.index = 0 ? max : this.index - 1;
    this.showModel();
  },
  _registerTriggers: function(){
    this.controlsView.on("control:next", this.showNext());
    this.controlsView.on("control:previous", this.showPrevious());
  }
}

var controller = new Controller();
var router = new Router({
  controller: Mod.controller
});
controller.start();

使用此方法可以分离视图和集合。这将使您的代码可重用(使用不同上下文中的控件视图作为示例)。

答案 1 :(得分:0)

您正在寻找CollectionViewCompositeView

CollectionView将循环遍历所有模型 指定的集合,使用指定的itemView渲染每个集合, 然后将项目视图的el的结果附加到集合视图中 el

CompositeViewCollectionView延伸以用作。{1}} 复合视图,用于表示两者的场景 树形结构中的分支和叶子,或者用于场景的场景 集合需要在包装器模板中呈现。