comparator
コレクションのメソッドを提供することで、目的を達成できます。
例:
ModelCollection = Backbone.Collection.extend({
comparator: function(a, b) {
if ( a.get("name") > b.get("name") ) return 1;
if ( a.get("name") < b.get("name") ) return -1;
if ( a.get("name") === b.get("name") ) return 0;
},
initialize: function() {
this.on('change:name', function() { this.sort() }, this);
}
});
この例では、コレクションが内部のモデルcomparator
の属性によって昇順で並べ替えられます。name
コレクションのいずれかの属性を変更しても、コレクションは自動的にソートされないことに注意してくださいmodels
。デフォルトでは、並べ替えは、新しいモデルを作成してコレクションに追加するときにのみ行われます。ただし、メソッドによって使用されcomparator
ますcollection.sort
。
change
上記のコードは、任意のsのコレクションname
をその属性に単純に再ソートするイベントリスナーを設定することにより、これを利用していますmodels
。
全体像を完成させるために、コレクションに関連付けられた適切なイベントリスナーを設定して、View
変更があった場合に再レンダリングされるようにします。
CollectionView = Backbone.View.extend({
initialize: function() {
this.collection = new ModelCollection();
this.collection.on('all', function() { this.render() }, this);
},
render: function() {
this.$el.html(this.collection.toJSON());
}
});
それでおしまい :)
バックボーンドキュメントからの関連する抜粋:
デフォルトではcomparator
、コレクションはありません。を定義するcomparator
と、コレクションをソートされた順序で維持するために使用されます。これは、モデルが追加されると、モデルがの正しいインデックスに挿入されることを意味しますcollection.models
。コンパレータは、sortBy
(単一の引数を取る関数を渡す)、sort
(2つの引数を期待するコンパレータ関数を渡す)、または並べ替える属性を示す文字列として定義できます。[...]後でモデル属性を変更した場合、が付いたコレクションは自動的に再ソートされないため、順序に影響するモデル属性を変更した後comparator
に呼び出すことをお勧めします。sort