Collections 如何用同一类型的多个合成视图构造木偶?

Collections 如何用同一类型的多个合成视图构造木偶?,collections,marionette,composite,Collections,Marionette,Composite,我们必须显示以下视图: 类别(显示为表格),每个类别表格应具有产品(tr) 我们如何使用木偶项目视图和CompositeView构建它 我们需要产品成为itemView 我们是否应该将每个类别都设置为CompositeView,并且有多个CompositeView?或者是否有其他替代方案将所有CompositeView包含到单个项目中,如: Collection(CompositeView???) -> CompositeView-category1 -> itemV

我们必须显示以下视图:

类别(显示为表格),每个类别表格应具有产品(tr)

我们如何使用木偶项目视图和CompositeView构建它

我们需要产品成为itemView

我们是否应该将每个类别都设置为CompositeView,并且有多个CompositeView?或者是否有其他替代方案将所有CompositeView包含到单个项目中,如:

Collection(CompositeView???)
  -> CompositeView-category1
      -> itemView-product1-1
      -> itemView-product1-2
  -> CompositeView-category2
      -> itemView-product2-1
      -> itemView-product2-2

我建议您使用布局视图,在此布局中,您可以为每个类别创建一个区域,并在这些区域上绘制复合视图

木偶网中布局视图的好处是,您可以传递一个模板,该模板应包含最初需要的所有HTML,例如带有按钮的标题,用于添加和删除类别等

CategoriesLayout = Backbone.Marionette.Layout.extend({
   template: "#layout-template",

   regions: {
    category1Region: "#category1",
    category2Region: "#category2"
  }
});;

and then you can render your composite views inside the regions

categoriesLayout = new CategoriesLayout();
categoriesLayout.category1Region.show(new CategoryView());
这样,您可以使用区域功能显示/关闭视图。如果需要动态添加区域,也可以使用Marionette.renderer呈现HTML,然后将区域附加到布局

此外,您可能还想看看木偶的区域管理器,它可以帮助您管理一组区域

编辑

我做了一个JSFIDLE来演示这一点,这只是一个例子,但我认为想法就在那里

那么你的问题在评论中的答案是什么

  categoriesLayout[dynamicRegion].show(new CategoryView())
只需确保DOM元素在那里(#dynamic),如果没有,只需在布局视图中附加HTML,或者使用marionette.Renderer对象为您的区域传递一个漂亮的模板

在运行中添加一个区域是没有问题的,木偶有一个用于该场景的方法


希望这会有所帮助,

我建议不要在顶层视图中使用布局,因为这样您就必须为添加的每个新类别手动创建一个区域。另一方面,使用CollectionView或CompositeView允许不受限制的类别数量(如果没有类别,甚至可以使用emptyView),而无需额外工作

是否使用CompositeView或CollectionView作为俯视图取决于是否需要模板包装器(用于按钮等)。如果你不喜欢,那就选择CollectionView

我认为您的做法是正确的,每个类别都是一个CompositeView,因此您可以使用tbody作为“itemViewContainer”的模板:

<table>
   <tbody>
   </tbody>
</table>
然后产品(项目视图)将使用:

tagName: 'tr'

但我有很多类别。另外,@Rayweb_在meens上渲染区域内的合成视图。因此,我将有一个包含多个ItemViews的compositeView的区域,这正是您不应该使用布局的原因。因为您必须手动为每个新类别添加新区域。而是让composite/collectionview为您呈现每个。。。我建议您重新阅读这些文档,因为您似乎对哪些区域以及在哪里/如何定义这些区域有点困惑。祝你好运。在这里,我必须为每个新类别手动添加一个新的compositeView。。。所以没有区别。不,对不起,这不对。。。假设您有一个类别集合,并且每个类别都有一个产品集合:类别->产品。。。您拥有呈现类别的CollectionView(或CompositeView),该CollectionView的每个“itemView”本身就是呈现产品的CollectionView(或CompositeView)。这样,您就可以拥有0-9999999个类别,而无需其他代码。就可维护性而言,这是一个很大的区别…对不起。。从你的回答中,我不明白你的意思是每个CollectionView(类别)本身就是一个CollectionView,直到我读了你最后的评论。这是我的问题,因为我在实现它时遇到了问题(CompositeView与CompositeView的集合)。手动创建区域有问题吗?另外,我必须添加动态区域,如下所示:
App.addRegion(category.name,“#”+category.name),我如何称呼它:
categoriesLayout.?.show(newcategoryview())
itemViewContainer: 'tbody'
tagName: 'tr'