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

到目前为止,我还无法成功为表列创建 subview ,这意味着我将数据绑定(bind)到DOM以便检索和操作表列。我的设计变得更加复杂,这使我重新评估了原始方法,希望有更好的方法可以通过 subview 管理这种情况。有任何想法吗?

最佳答案

您可以利用以下事实

  • jQuery对象是DOM元素列表
  • 主干网不需要唯一的DOM节点(至少据我所知)
  • 然后, View 中的
  • this.$el可以是您想要的任何节点

  • 考虑到这一点,您可以一次性渲染表格(请参见BackboneJS Rendering Problems,它更快,并且在您的情况下可能更容易),然后将 subview 应用于与模型关联的表格单元。我使用了一个用于选择的类名,但是每行第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>
    

    View
    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/中 checkin 一样,每列均由专用 View 处理。

    09-25 15:49