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');
}

当对字符串值按字母顺序排序时,这应该如何工作?

如果您拥有的只是字符串值,那么也许可以转换为Date之前的日期?
我有同样的问题,这解决了它。

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

这仅适用于日期(使用-前缀时会转换为数字),但不适用于您要按字母顺序排序的任意字符串。

您当然是对的,我以为您仍在谈论日期(例如OP),但是您的日期是可转换的字符串。 然后我的错误:)。

下一个版本的Backbone(和当前的主服务器)将支持比较器的sort排序(而不仅仅是sortBy ),因此您可以按常规方式进行定义。

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

如果同一集合有多个用例,其中一些应按一个顺序显示,而另一种则按相反顺序显示,该怎么办? 您的比较器和排序实现只能选择一个方向或另一个方向,似乎没有Collection.reverse()能够快速切换排序方向(升序还是降序)。

@ elwayman02您可以仅维护2个集合实例(Collection#clone可能会有所帮助)

这并不是特别有用……例如,当集合表示一个数据网格时,我将在多个方向上反复对其进行排序。 尝试维护两个不同的数据源并在它们之间进行切换是没有意义的。 我们应该根据需要操纵一个数据对象。

我已经在一个集合上存储了多个比较器,并根据需要将它们交换了出去。

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();

这是一个更好的解决方法,尽管我仍然不明白为什么需要一种解决方法而不是仅支持反向()方法的主干。

你也可以

collection.set(collection.models.reverse(), {sort: false});
此页面是否有帮助?
0 / 5 - 0 等级