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()メソッドを使用して、データを「行」と「列」のグループとして再フォーマットしました。後で遭遇したのは、同じデータセットを別の用途に使用したいということでしたが、私の解析ソリューションはそれを破っていました。

2番目のコレクションとフェッチを作成するのではなく、外部ビューの初期化中にデータを変更しています。関連するコードは次のとおりです。

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")としてグリッドから行に渡す方法でした。私がやったことは、データを新しいジェネリックコレクションオブジェクトに移動することでした。その行で、モデル属性からデータを取得しています。これが進むべき道だと言っているわけではありませんがうまくいきます。

于 2012-11-16T20:56:59.460 に答える
1

使用することもできます: CompositeView (TableView) -> CompositeView (RowView) -> ItemView (ColumnView)

最初のCompositeView (TableView)はテーブルをレンダリングし、3 つのオブジェクトをコレクションからRowViewに渡します。

1 つではなく3 つのオブジェクトをRowViewに渡すには、 TableViewの内部構造を変更する必要があります。または、コレクションを再構築して行にグループ化することもできます。

[
    [{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"}]
]

2 番目の CompositeView (RowView)は、 ItemViewの行と各オブジェクトをレンダリングします。

于 2012-10-04T10:58:17.747 に答える