3

有没有人使用 Backbone.js 使用垂直表列作为视图“el”取得任何成功?由于表是基于行的,因此使用表行作为与视图关联的 DOM 容器很简单。但是,我需要实现的布局是垂直的,因此表格列将是我设计的“el”,但表格列没有类似的容器元素,因为表格布局是水平的。

到目前为止,我还不能成功地为表列创建子视图,这意味着我将数据绑定到我的 DOM 以便检索和操作表列。我的设计变得更加复杂,这导致我重新评估原始方法,希望有更好的方法通过子视图来管理这种情况。有任何想法吗?

4

2 回答 2

3

您可以利用以下事实

  • jQuery 对象是 DOM 元素的列表
  • Backbone 不需要唯一的 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/中查看的那样,每一列都由专用视图处理。

于 2013-01-22T17:25:13.597 回答
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;
}

这个小提琴中的一个工作样本。这个解决方案当然远非完美,因为如果你有可变大小的内容,你必须自己实现行大小。但是如果你需要获取 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>

此小提琴中的修订版

于 2013-01-22T16:51:27.870 回答