【问题标题】:Best practice to use nested templates in marionette.js在 marionette.js 中使用嵌套模板的最佳实践
【发布时间】:2013-09-20 10:46:31
【问题描述】:

我一直在研究单页应用程序,并从今天开始使用 Marionette.js。 我发现应用程序的整体结构非常有效(模块、事件等),当使用复杂的数据结构时,我不知道如何使用模板(视图)来获取其中的大部分。我习惯于类似把手的模板,这些模板可以做一些额外的逻辑和嵌套。

显示嵌套模板的最佳做法是什么?

考虑一下这个包含嵌套数据的不那么复杂的数据结构:

[{name:"John", addresses:
  [
    {street:"John Street",city:"New York, NY"},
    {street:"John Street",city:"Madrid, PA"}
  ],
  notes: [{note:"note1"},{note:"note2"}]
  },
  {name:"Alex", addresses:
  [
    {street:"Alex Street",city:"New York, NY"},
    {street:"Alex Street",city:"Madrid, PA"}
  ],
  notes: {}}
]

如何有效地将第一级数组呈现为表格行和内部数组(如“地址”和“注释”)到行中的各个列(例如,以另一个表格的形式)。

【问题讨论】:

    标签: javascript nested marionette


    【解决方案1】:

    Marionette 提供了 Collection 和 CompositeViews 来呈现对象集合。 使用 CompositeView 可以有效地呈现表格 请参阅CompositeView 的文档 - 它有一个如何使用复合视图呈现表格的示例。

    为了呈现复杂的嵌套结构,最好使用 Handlebars,因为它允许引用嵌套字段示例:{{x.y}}

    【讨论】:

      【解决方案2】:

      您可以使用CollectionView,您的数组将作为其collection 传递给视图,然后您可以循环遍历每一行的addresses 以显示它们。

      我不会为addresses 数组的每个元素创建视图,因为不需要自己管理它们,它们会在显示主视图时显示(对吗?)。

      所以你可以有这样的东西

      NoUsers = Backbone.Marionette.ItemView.extend({
        template: "#no-users-template"
      });
      

      当传递的collection为空时使用

      User = Backbone.Marionette.ItemView.extend({});
      

      它将定义如何呈现单个用户(您的顶级数组元素),您可以使用 Handlebars 执行 addresses 循环,类似于

      <div>
        {{ #each addresses }}
        <span>{{ street }} - {{ city }}</span>
        {{/each}}
      </div>
      
      Users = Backbone.Marionette.CollectionView({
        itemView: User,
        emptyView: NoUsers
      });
      

      这将定义它们如何一起发挥作用,有关详细示例,请参阅由 Marionette 的创建者 DErick Bailey 制作的 this example app

      【讨论】:

      • 在这种情况下,用户(即 Itemview)应该实现额外的逻辑(就像你说的循环遍历地址和注释,将它们放入临时变量然后渲染它?)。我应该在初始化或 beforeRender 之类的地方做吗?
      • 通常你在模板中做这样的事情,使用把手的每个来做循环,看我更新的答案。
      • 感谢您的回复,但这些车把模板不能开箱即用,或者他们会吗?我还应该在 itemview 中重新定义“模板”方法以将其指向车把吗?
      • 你应该在你的项目中导入把手。关于如何做到这一点有详细的指南,这并不难。
      • 好的,由于版本冲突,给木偶添加把手很复杂。目前我决定使用这样的怪物: onBeforeRender: function(){ this.model.set('tmp_field',this.model.has('addresses')? _.reduce(this.model.get(' address'), function(result, value){return result+"Address: "+value.street+" " +value.city+ "
        ";},""):"没有地址"); }
      【解决方案3】:

      如果你使用下划线,你可以这样做

      <%= Marionette.Renderer.render('#your-template', {
          your: data,
          goes: here
      }) %>
      

      或者更好的例子是

      <% _.each(someArrayOnModel, function(item) { %>
          <%= Marionette.Renderer.render('#templateForItem', item) %>
      <% }); %> 
      

      【讨论】:

      • 听起来不错,但有点打破了 MVC 的概念。在这种情况下,“您的数据在此处”也应该类似于 this.model.addresses?
      • 如果您使用下划线并且不想要 CollectionView 的开销,这是一个很好的方法
      • 这里的问题之一是 itemview(如果从 CompositeView 调用)得到一个“模型”,而不是一个“集合”并且 _.each 不能正常工作。我试过 _.each(this.model) 但它没有给出任何结果。
      • 正确,如果您这样做,那么您可能没有使用复合视图或集合视图。这些东西很酷(在这种情况下,您将使用 marionette itemviews 来处理子模板)但是对于许多只读场景,它们会带来不必要的开销,所以我只使用 itemview(将集合作为模型)并循环,如下所示
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2011-07-12
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多