T N*_*yen 5 javascript backbone.js marionette
我有一个CompositeView(一个表),集合中的每个模型都表示为两个表行,模板如下:
<tr class="row-parent">
<td>parent info here</td>
</tr>
<tr class="row-child">
<td>child info here</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
使用这样的ItemView:
var ItemView = Backbone.Marionette.ItemView.extend({
template: ItemTmpl
});
Run Code Online (Sandbox Code Playgroud)
尽管它们被命名为"父"和"孩子",但它们实际上是同一模型的同伴成员.如果我没有指定tagName,Backbone会将每个视图包装在一个<div>无效的HTML中,并且还会破坏布局.
所以我想,为什么不删除外部<tr>标签,让Backbone添加它们.所以我更新了我的模板:
<td>parent info here</td>
</tr>
<tr class="row-child">
<td>child info here</td>
Run Code Online (Sandbox Code Playgroud)
并将视图更新为:
var ItemView = Backbone.Marionette.ItemView.extend({
template: ItemTmpl,
tagName: 'tr',
className: 'row-parent'
});
Run Code Online (Sandbox Code Playgroud)
我希望外部标签与内部标签碎片结合,但Marionette不喜欢这样.它只显示了行子.所以我不确定从哪里开始.我正在考虑两种策略,但还没有详细介绍.
覆盖Backbone的任何部分创建额外的div以不创建它,或覆盖Marionette的一部分,该部分附加视图以在追加之前移除div.
创建一个名为CompositeMultiView的新类型的视图,当然,它将扩展CompositeView,并允许您指定第二个ItemView,或者可能只是一个视图数组,所有这些都将为给定的每个模型呈现.这个计划似乎更多的工作,但更少被黑客入侵.
有没有人有任何更好的建议,解决方法或具体的指示,我将如何实施上述两个计划中的任何一个?
这是表格应该是什么样子的模型:

您可以尝试按如下方式修改 CompositeView:
itemView为视图数组addChildView以渲染每个模型的每个视图这个解决方案最终看起来很像你的“B 计划”。试一试:
itemView: [My.ParentView, My.ChildView],
addChildView: function(item, collection, options){
this.closeEmptyView();
var itemViews = this.getItemView(item);
var index = this.collection.indexOf(item);
_.each(itemViews, function(ItemView) {
this.addItemView(item, ItemView, index);
});
}
Run Code Online (Sandbox Code Playgroud)
我还没有考虑过这是否会处理诸如 之类的模型事件destroy,但我相信它应该优雅地处理它们。
| 归档时间: |
|
| 查看次数: |
4661 次 |
| 最近记录: |