Backbone / Underscore sortBy不排序集合

时间:2012-03-21 11:07:35

标签: javascript backbone.js

我在一个包含'firstname','lastname'属性的集合中有一个用户列表(确切地说是六个)。执行获取时,下面的比较器按'firstname'对它们进行排序,它可以正常工作。

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

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

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

我做错了什么?


更新


因此从sortBy IS返回的数据已经排序,但这对我来说并没有帮助,因为我的视图与集合相关联。如果我重置集合并将已排序的数组添加回集合,那么它的比较器会完成它的工作并将其排序回“firstname”顺序。

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

3 个答案:

答案 0 :(得分:13)

要回复您的更新:

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

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

this.collection.sort();

答案 1 :(得分:12)

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


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

现在您可以使用sortedCollection,它将被正确排序。

答案 2 :(得分:3)

Backders使用的下划线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);