2

我试图弄清楚如何有效地将模型集合移动到视图中的网格模式。

这是一个关于简单集合的行/列原理的问题。

假设我有以下Collection

[
    {id: 1, title="test 1"},
    {id: 2, title="test 2"},
    {id: 3, title="test 3"},
    {id: 4, title="test 4"},
    {id: 5, title="test 5"},
    {id: 6, title="test 6"}
]

我希望它显示为:

网格:

“测试 1” “测试 2” “测试 3”

“测试 4” “测试 5” “测试 6”

在 twitter 引导程序中,我会这样写:

<div id="myContainer">
    <div class="row-fluid">
        <div class="span4">test 1</div>
        <div class="span4">test 2</div>
        <div class="span4">test 3</div>
    </div>
    <div class="row-fluid">
        <div class="span4">test 4</div>
        <div class="span4">test 5</div>
        <div class="span4">test 6</div>
    </div>
</div>

我尝试覆盖我的 appendHtml CompositeView

appendHtml: function(compositeView, itemView, index){
    ... 
    if ((index % 3) === 0  || lastelement){
        ... append
    }
} 

更直接地这个实现:

                    this.cacheColumns.push(itemView.el);



                    // If current index (+1) has rest of 0 when we devide it by column amount 

                    // OR

                    // End of array loop.

                    if (((index+1) % this.colAmount) === 0 || index == this.collection.length-1){

                            var row = $('<div class="row-fluid" />');

                            for(var i = 0; i < this.cacheColumns.length; i++){

                                    row.append(this.cacheColumns[i]);                               

                            }

                            this.cacheColumns = [];

                            collectionView.$(".jsListImages").append(row);

                    }

然而,这种方法在添加/删除项目时会产生很多错误,奇怪的错误。

是否应该创建一个生成 3 个项目集合的新集合的方法?

所以而不是:

Collection -> Item

我可以

Collection -> Collection -> Item

现在我也尝试了这个实现,添加/删除项目时没有按预期工作,使用后退/前进箭头进入特定页面时也生成了未知项目:

View.ImageMultiUploader = Marionette.CompositeView.extend({
    template : '#common-multi-imageuploader-composite',

    itemView : ImageMultiItem,

    colAmount : 3, // How many columns we got.

    cacheColumns : [], // appendHtml uses this. don't change.

    /**

     * Custom implementation of appendHtml, using this, we can use row/column

     * principle on a collection. 

     */

    appendHtml : function(collectionView, itemView, index) {

        this.cacheColumns.push(itemView.el);

        // If current index (+1) has rest of 0 when we devide it by column amount 

        // OR

        // End of array loop.

        if (((index + 1) % this.colAmount) === 0
                || index == this.collection.length - 1) {

            var row = $('<div class="row-fluid" />');

            for ( var i = 0; i < this.cacheColumns.length; i++) {

                row.append(this.cacheColumns[i]);

            }

            this.cacheColumns = [];

            collectionView.$(".jsListImages").append(row);

        }

    },

    onRender : function() {

        console.log(this.collection)

    }

});
4

2 回答 2

12

我遇到了几乎相同的问题,@g00fy 的回答让我指出了正确的方向。在早期的迭代中,我在我的集​​合中使用 parse() 方法将数据重新格式化为“行”和“列”组。我后来遇到的是想将相同的数据集用于不同的用途——但我的解析解决方案打破了这一点。

我没有创建第二个集合 + 提取,而是在外部视图初始化期间修改数据。以下是相关代码:

Views.GridRow = Backbone.Marionette.CompositeView.extend({
    template: "#row-template",
    itemView: Views.GridItem,
    itemViewContainer: "div.row-fluid",
    initialize: function() {
        this.collection = new Backbone.Collection(_.toArray(this.model.attributes));
    }
});

Views.Grid = Backbone.Marionette.CompositeView.extend({
    template: "#grid-template",
    itemView: Views.GridRow,
    itemViewContainer: "section",
    initialize: function() {
        var grid = this.collection.groupBy(function(list, iterator) {
            return Math.floor(iterator / 4); // 4 == number of columns
        });
        this.collection = new Backbone.Collection(_.toArray(grid));
    }
});

这是一个工作演示:

http://jsfiddle.net/bryanbuchs/c72Vg/

我想不通的是如何将分组数据从网格传递到行,因为我可以轻松访问(“this.collection”)。我最终做的是将数据移动到新的通用 Collection 对象中,并且在行中我从模型属性中获取它。不是说这是要走的路,但它确实有效。

于 2012-11-16T20:56:59.460 回答
1

您可能想要使用:CompositeView (TableView) -> CompositeView (RowView) -> ItemView (ColumnView)

第一个CompositeView (TableView)将渲染表格并将 3 个对象从集合传递到RowView

您需要更改TableView中的一些内部结构以将 3 个对象而不是一个对象传递给RowView,或者您可以重组集合以按行分组,例如:

[
    [{id: 1, title="test 1"},        {id: 2, title="test 2"},        {id: 3, title="test 3"}],
    [{id: 4, title="test 4"},        {id: 5, title="test 5"},        {id: 6, title="test 6"}]
]

第二个CompositeView (RowView)将渲染行和ItemView中的每个对象

于 2012-10-04T10:58:17.747 回答