Backbone: コレクション内のモデルの逆ソート順

作成日 2011年04月11日  ·  12コメント  ·  ソース: jashkenas/backbone

ねえ、

コレクションの並べ替え順序を逆にする最良の方法は何ですか? 私のコンパレータはすべてのモデルを日付でソートします。
しかし、私はそれらを逆の順序で必要とします。 toArray()reverse()はかなり醜いようです。

ここで重要なものを見逃していないので、バックボーンモデル属性に投票して設定します
コンパレータとともにソート順。

乾杯、
ダニエル

question

最も参考になるコメント

あなたもすることができます

collection.set(collection.models.reverse(), {sort: false});

全てのコメント12件

コレクションの種類を逆にする最良の方法は、比較基準から負の値を返すことです。

comparator : function(model) {
  return -model.get('date');
}

文字列値をアルファベット順に並べ替える場合、これはどのように機能するはずですか?

あなたが持っているのが文字列値だけなら、多分前の日付に変換しますか?
私は同じ問題を抱えていました、そしてこれはそれを解決しました。

comparator : function(model) {
  return -new Date(model.get('date'));
}

これは日付(接頭辞-を付けると数字に変換されます)に対してのみ機能しますが、アルファベット順に並べ替える任意の文字列に対しては機能しません。

もちろん、あなたは正しいです、私はあなたがまだ日付について話していると思いました(OPのように)、しかしあなたの日付は変換可能な文字列でした。 私の間違い:)。

バックボーンの次のバージョン(および現在のマスター)は、コンパレーターのsort順序を( sortByだけでなく)サポートするため、通常の方法で定義できます。

comparator: function(a, b) {
  ...
}

同じコレクションに複数のユースケースがあり、その一部を1つの順序で表示し、もう1つを逆に表示する必要がある場合はどうしますか? コンパレータとソートの実装はどちらか一方の方向しか選択できません。ソート方向(昇順と降順)をすばやく切り替えることができるCollection.reverse()はないようです。

@ elwayman02 2つのコレクションインスタンスを維持できます(Collection#cloneが役立つ場合があります)

これは特に有用ではありません...たとえば、コレクションがデータのグリッドを表し、複数の方向に繰り返し並べ替える状況を考えてみましょう。 2つの異なるデータソースを維持して、それらを切り替えることは意味がありません。 必要に応じて操作するデータオブジェクトが1つあるはずです。

コレクションに複数のコンパレータを保存し、必要に応じてそれらを交換しました。

var Collection = Backbone.Collection.extend({
  comparators: {
    a: function () {},
    b: function () {}
  },

  setComparator: function (key) {
    this.comparator = this.comparators[key];
    return this;
  }
});
var collection = new Collection();
collection.setComparator('a').sort();
collection.setComparator('b').sort();

バックボーンが単にreverse()メソッドをサポートするのではなく、回避策が必要な理由はまだわかりませんが、これはより良い回避策です。

あなたもすることができます

collection.set(collection.models.reverse(), {sort: false});
このページは役に立ちましたか?
0 / 5 - 0 評価