有没有人使用 Backbone.js 使用垂直表列作为视图“el”取得任何成功?由于表是基于行的,因此使用表行作为与视图关联的 DOM 容器很简单。但是,我需要实现的布局是垂直的,因此表格列将是我设计的“el”,但表格列没有类似的容器元素,因为表格布局是水平的。
到目前为止,我还不能成功地为表列创建子视图,这意味着我将数据绑定到我的 DOM 以便检索和操作表列。我的设计变得更加复杂,这导致我重新评估原始方法,希望有更好的方法通过子视图来管理这种情况。有任何想法吗?
有没有人使用 Backbone.js 使用垂直表列作为视图“el”取得任何成功?由于表是基于行的,因此使用表行作为与视图关联的 DOM 容器很简单。但是,我需要实现的布局是垂直的,因此表格列将是我设计的“el”,但表格列没有类似的容器元素,因为表格布局是水平的。
到目前为止,我还不能成功地为表列创建子视图,这意味着我将数据绑定到我的 DOM 以便检索和操作表列。我的设计变得更加复杂,这导致我重新评估原始方法,希望有更好的方法通过子视图来管理这种情况。有任何想法吗?
您可以利用以下事实
this.$el
然后在视图中可以是您想要的任何节点考虑到这一点,您可以一次性渲染您的表格(请参阅BackboneJS 渲染问题,它更快,在您的情况下可能更容易),然后将您的子视图应用于与模型关联的表格单元格。我使用了一个类名进行选择,但是每行的第 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/中查看的那样,每一列都由专用视图处理。
我想不出一个直接解决您问题的方法。让多个视图共享<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;
}
这个小提琴中的一个工作样本。这个解决方案当然远非完美,因为如果你有可变大小的内容,你必须自己实现行大小。但是如果你需要获取 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>