【问题标题】:How to override or change comparator on backbone collection? [duplicate]如何覆盖或更改骨干集合上的比较器? [复制]
【发布时间】:2014-06-10 17:36:59
【问题描述】:

我有一个名为Topics 的主干集合,在我的应用程序中的一个实例中,我希望按我称为view_count 的属性进行排序。

Topics 集合的另一个实例我想按 name 的字母顺序排序。

目前,在收藏中,我有一个比较器:

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

当我希望按name 而不是view_count 对集合进行排序时,覆盖或更改比较器/排序选项的优雅方法是什么?我试图在似乎无法正常工作的主题集合 bu 的每次初始化上声明比较器函数。

【问题讨论】:

  • 类似问题已在link 处得到解答。希望对参考也有帮助。

标签: sorting backbone.js comparator


【解决方案1】:

将您的收藏更改为:

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会发生什么?
  • 你为什么认为它是一个字符串?属性名称肯定是一个字符串,但实际的模型属性可以是任何值。一旦知道 sortBy 的值,由 OP 决定如何进行实际排序。他可以使用 if/else 根据 sortBy 的值进一步自定义比较器,但我认为这很明显。
  • 为什么你会期望一个叫做“名字”的东西是一个数字?您的示例代码将尝试将名称字符串与-1 相乘,这没有任何意义,因此您的答案非常不完整。此外,简单地设置 sortBy 属性不会使用集合。
  • 我更新了答案,以防如何进一步自定义排序不够明显。问题不在于如何进行排序/排序,而在于如何确定在排序中使用什么模型属性。
  • 我还将 sortBy 重命名为 sortProperty,不要将其与骨干网的 sortBy 混淆。这是一个自定义属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2020-08-09
  • 1970-01-01
  • 2016-06-07
  • 2012-03-14
相关资源
最近更新 更多