有没有人使用垂直表列作为使用Backbone.js的视图'el'获得成功?由于表是基于行的,因此使用表行作为与视图关联的DOM容器是微不足道的。但是,我需要实现的布局是垂直的,因此表格列将是我设计的“el”,但是表格列没有类似的容器元素,因为表格布局是水平的。
到目前为止,我还没能成功为表列创建子视图,这意味着我将数据绑定到DOM以便检索和操作表列。我的设计变得更加复杂,这使我重新评估原始方法,希望通过子视图有更好的方法来管理这种情况。有什么想法吗?
答案 0 :(得分:3)
您可以利用
这一事实this.$el
可以是您想要的任何节点考虑到这一点,您可以一次性渲染您的表格(请参阅BackboneJS Rendering Problems,它更快,在您的情况下可能更容易),然后将您的子视图应用于与模型。我选择了一个类名进行选择,但每行的第n个元素上的选择器应该可以工作。
模板
<table>
<thead>
<tr>
<th></th>
<% _(children).each(function(model) { %>
<th><%= model.id %></th>
<% }); %>
</tr>
</thead>
<tbody>
<% _(properties).each(function(prop) { %>
<tr>
<td><%= prop %></td>
<% _(children).each(function(model) { %>
<td class="<%= model.cid %>"><% print(model[prop]); %></td>
<% }); %>
</tr>
<% }); %>
</tbody>
</table>
查看
ListView = Backbone.View.extend({
initialize: function(opts) {
this.options = opts;
},
render: function () {
var data, html, $table, template = this.options.template;
data = this.collection.map(function (model) {
return _.extend(model.toJSON(), {
cid: model.cid
});
});
html = this.options.template({
children: data,
properties: ['id', 'name']
});
$table = $(html);
this.collection.each(function (model, ix) {
var $el = $table.find("." + model.cid),
subview = new ItemView({
el: $el,
model: model
});
});
this.$el.empty();
this.$el.append($table);
return this;
}
});
您可以查看此演示http://jsfiddle.net/nikoshr/psasT/12/,每个列都由专用视图处理。
答案 1 :(得分:0)
我无法想到解决问题的简单方法。将多个视图共享<table>
元素作为el
听起来像是一个潜在的噩梦。
如何从不同的角度攻击问题,而不是使用HTML表,从浮动的<div>
元素构建表列,并将视图绑定到这些元素?类似的东西:
<div class="faux-table">
<div class="faux-column">
<div class="faux-header">Col 1</div>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
<div>Qux</div>
</div>
<div class="faux-column">
<div class="faux-header">Col 2</div>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
<div>Qux</div>
</div>
</div>
CSS规则:
.faux-table > div.faux-column {
float:left;
}
this fiddle中的工作样本。这个解决方案当然远非完美,因为如果你有不同大小的内容,你将不得不自己实现行大小调整。但是如果你需要通过Backbone视图渲染表,这可能是从JS角度来看最简单的方法。
编辑:实际上,对我而言,一个更好,更不易解决的问题是将表<td>
元素用作列,并将行实现为<div>
s没有任何CSS漂浮黑客:
<table>
<tr>
<td class="faux-column">
<div class="faux-header">Col 1</div>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
<div>Qux</div>
</td>
<td class="faux-column">
<div class="faux-header">Col 2</div>
<div>Foo</div>
<div>Bar</div>
<div>Baz</div>
<div>Qux</div>
</td>
</tr>
</table>