3

同じページの2つの異なる場所に同じバックボーンモデルのコレクションを表示する必要があり(ナビゲーションに1回、メインエリアに1回)、コレクション内のモデルの同期を維持する必要がありますが、各コレクションを並べ替えることができます別の方法で。ナビゲーションは常にアルファベット順ですが、メインコンテンツ領域での並べ替えはユーザーが構成できます。これを行うための最良の方法は何ですか?モデルが常に同一であることを確認するために、2つの異なるコレクションとイベントバインディングを用意する必要がありますか(追加/削除/リセットイベントを使用)?コレクションを1つだけ持っていて、必要に応じてその場で並べ替え順序を変更する必要がありますか?

4

3 に答える 3

3

私は通常、一時的な並べ替えを表すためにコレクションを変更すべきではないと考えています。

  • ビューは通常のイベントのコレクションをリッスンし、
  • ビューは、レンダリングする必要があるときに、必要に応じて並べ替えられたモデルのカスタム リストを取得します。

例えば、

var C = Backbone.Collection.extend({
    comparator: function (model) {
        return model.get('name');
    },

    toJSON_sorted: function (reversed) {
        var models = this.toJSON();
        return (!reversed) ? models : models.reverse();
    }
});

var V = Backbone.View.extend({
    initialize: function () {
        this.collection.on('reset', this.render, this);
        this.collection.on('change', this.render, this);
        this.collection.on('add', this.render, this);
        this.collection.on('delete', this.render, this);
    }
});
var NavView = V.extend({
    render : function () {
        console.log(this.collection.toJSON());
    }
});
var MainView = V.extend({
    render : function () {
        var data = this.collection.toJSON_sorted(this.reversed);
        console.log(data);
    }
});

これらの定義を呼び出す

var c=new C();
var v1 = new NavView({collection:c});
var v2 = new MainView({collection:c});
v2.reversed=true;

c.reset([
    {name:'Z'},
    {name:'A'},
    {name:'E'}
]);

ビューに期待される順序でモデルを提供し、ソート方向を自由に変更できるようにします。toJSON_sorted他のフィールドによるソートを処理するように調整することもできます。

http://jsfiddle.net/nikoshr/Yu8y8/で遊ぶフィドル

于 2012-09-11T16:32:35.820 に答える
1

コレクションにまったく同じものが含まれている場合は、1 つのコレクションを保持し、それを両方のディスプレイに使用するのが最もきれいだと思います。必要なビジュアル コンポーネントをレンダリングする前に、並べ替え関数を呼び出すだけです。

于 2012-09-11T15:44:01.863 に答える
0

コンパレータ機能を変更するだけです。コレクションにはこれを行うためのメソッドがありますが、基本的な考え方は

var mycollection = new Backbone.Collection();
mycollection.comparator = function(item) { return item.get('blah') }
于 2012-09-11T16:21:19.520 に答える