【问题标题】:Backbone/Underscore sortBy is not sorting collection骨干/下划线 sortBy 不是排序集合
【发布时间】:2012-03-21 11:07:35
【问题描述】:

我有一个包含“名字”、“姓氏”属性的集合中的用户列表(确切地说是六个)。进行提取时,下面的比较器按“名字”对它们进行排序,并且工作正常。

comparator : function (user) {
  return user.get("firstname").toLowerCase();
}

但如果我稍后尝试按不同的值(即“姓氏”)对集合进行排序,则它不起作用。顺序保持不变。

this.collection.sortBy(function(user) {
  return user.get("lastname").toLowerCase();
});

我做错了什么?


更新


所以从 sortBy 返回的数据是排序的,但这对我没有帮助,因为我的视图链接到集合。如果我重置集合并将排序后的数组添加回集合中,它的比较器就可以完成工作并将其重新排序为“名字”顺序。

var sorted = this.collection.sortBy(function(user) {
  return user.get("lastname").toLowerCase();
});

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    回复您的更新:

    如果您想更改集合的排序顺序以供其相应视图使用,则只需更新comparator,然后调用sort 即可重新排序模型。然后这将触发一个sort 事件,您的视图可以侦听该事件并相应地更新自身。

    this.collection.comparator = function (user) {
      return user.get("firstname").toLowerCase();
    };
    
    this.collection.sort();
    

    【讨论】:

    • 这绝对是最好的答案。
    【解决方案2】:

    sortBy 函数不对当前集合中的对象进行排序。它返回一个排序的集合:

    
    var sortedCollection = this.collection.sortBy(function(user){
      return user.get("lastname").toLowerCase();
    });
    

    现在你可以使用sortedCollection,它会被正确排序。

    【讨论】:

    • 那个比较器函数不应该返回整数吗?
    • 请注意,这将返回一个列表而不是一个集合。没什么大不了的,但值得一提。
    【解决方案3】:

    Backbone 使用的下划线的sortBy返回排序后的集合没有就地排序... 举例说明:

    var flinstones = [{first: 'Baby', last: 'Puss'}, {first: 'Fred', last: 'Flinstone'}];
    var sorted = _.sortBy(flinstones, function (character) { return character.last ; });
    console.log(sorted);
    console.log(flinstones);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多