骨干视图el作为表列

时间:2013-01-21 21:11:51

标签: javascript backbone.js backbone-views

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

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

2 个答案:

答案 0 :(得分:3)

您可以利用

这一事实
  • jQuery对象是DOM元素的列表
  • Backbone不需要唯一的DOM节点(至少据我所知)
  • 视图中的
  • 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>

Revised version in this fiddle