Backbone/Underscore的sortBy方法未能对集合进行排序

8

我有一个包含“firstname”和“lastname”属性的用户列表(确切地说,有六个用户)。通过执行fetch操作,下面的比较器按照“firstname”对它们进行排序,而且它工作得很好。

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

但是如果我尝试稍后按不同的值,例如“lastname”对集合进行排序,它就无法工作。顺序保持不变。

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

我做错了什么?


更新


所以,从sortBy返回的数据已经排序,但这对我并没有真正帮助,因为我的视图与集合相关联。如果我重置集合并将排序后的数组添加回集合中,则其比较器会发挥作用,并将其重新按“名字”顺序排序。

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

13

针对您的更新作出回应:

如果您想要更改集合排序方式以供相应视图使用,则可以更新比较器并调用sort来重新对模型进行排序。 这将触发一个sort事件,您的视图可以侦听此事件并相应地更新自身。

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

this.collection.sort();

这绝对是这里最好的答案。 - Chris

12

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


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

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


比较器函数不应该返回整数吗? - Arnis Lapsa
2
请注意,这将返回一个列表而不是一个集合。虽然不是很重要,但值得一提。 - Chris

3

Underscore的sortBy函数是Backbone使用的,它返回已排序的集合而不是直接在原地进行排序...

为了说明:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接