Sorting 如何覆盖或更改主干集合上的比较器?

Sorting 如何覆盖或更改主干集合上的比较器?,sorting,backbone.js,comparator,Sorting,Backbone.js,Comparator,我有一个名为主题的主干集合,在我的应用程序中的一个实例中,我希望按照我调用的属性查看\u计数进行排序 主题集合的另一个实例,我想按名称字母顺序排序 目前,在该系列中,我有一个比较器: comparator: (topic) -> return topic.get('view_count') * -1 如果我希望集合按名称排序,而不是按查看计数排序,那么覆盖或更改比较器/排序选项的优雅方式是什么?我尝试在每次初始化主题集合bu时声明comparator函数,该函数似乎无法正

我有一个名为
主题
的主干集合,在我的应用程序中的一个实例中,我希望按照我调用的属性
查看\u计数
进行排序

主题
集合的另一个实例,我想按
名称
字母顺序排序

目前,在该系列中,我有一个比较器:

  comparator: (topic) -> 
     return topic.get('view_count') * -1

如果我希望集合按
名称
排序,而不是按
查看计数
排序,那么覆盖或更改比较器/排序选项的优雅方式是什么?我尝试在每次初始化主题集合bu时声明comparator函数,该函数似乎无法正常工作。

将集合更改为:

var Topics = Backbone.Collection.extend({
  initialize: function(options) {
    this.sortProperty = options.sortProperty;
  },
  comparator: function(topic) {
    if(this.sortProperty == "view_count")
      return topic.get("view_count") * -1;
    else
      return topic.get("name");
  }      
});
然后,在实例化集合时:

var topics1 = new Topics({sortProperty : "view_count"});
var topics2 = new Topics({sortProperty : "name"});
您还可以在初始化集合后使用以下命令更改排序属性:

topics1.sortProperty = "name";

这里也回答了类似的问题。希望对参考也有帮助。当你把一个字符串乘以
-1
时会发生什么?为什么你认为它是一个字符串?属性名称当然是一个字符串,但实际的模型属性可以是任何值。一旦OP知道sortBy的值,他就可以决定如何进行实际排序。他可以使用if/else根据sortBy的值进一步定制比较器,但我认为这是非常明显的。为什么你会期望称为“name”的东西是一个数字?您的示例代码将尝试将名称字符串乘以
-1
,这没有任何意义,因此您的答案非常不完整。另外,简单地设置
sortBy
属性也不会使用集合。我更新了答案,以防它不太清楚如何进一步自定义排序。问题不在于如何进行排序,而在于如何确定在排序中使用什么模型属性。我还将sortBy重命名为sortProperty,而不是将其与主干的sortBy混淆。这是一个自定义属性。