2012-03-21 2 views
8

У меня есть список пользователей (шесть, если быть точным) в коллекции с свойствами «firstname», «lastname». Выполняя выборку, компаратор ниже сортирует их по «первому», и он отлично работает.Backbone/Underscore sortBy не сортирует коллекцию

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

Но если я пытаюсь отсортировать коллекцию позже, другое значение, т.е. «фамилия», он не работает. Порядок остается прежним.

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

Что я делаю неправильно?


Update


Таким образом, данные, возвращаемые из SortBy отсортирован, но это не помогает мне на самом деле, как моя точка зрения связана с коллекцией. Если я сброшу коллекцию и добавлю отсортированный массив обратно в коллекцию, то это компаратор выполнит ее работу и отсортирует ее в порядке «имя».

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

ответ

11

sortBy функция не сортирует объекты в текущей коллекции. Она возвращает отсортированные коллекции:


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

Теперь вы можете использовать sortedCollection и он будет отсортирован правильно.

+0

Спасибо Derick. И спасибо за ваш сайт. Это отличный ресурс разработчика. – screenm0nkey

+0

не то, что функция компаратора должна возвращать целое число? –

+2

Обратите внимание, что это возвращает список, а не коллекцию. Не так много, но стоит упомянуть. – Chris

3

Подчеркивание-х 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); 
+1

+1 Спасибо за ответ. – screenm0nkey

13

Чтобы ответить на ваше обновление:

Если вы желающей чтобы изменить порядок сортировки коллекции для использования по соответствующему представлению, тогда вы можете просто обновить comparator, а затем позвонить sort, чтобы получить повторную сортировку модели. Затем будет возбуждено событие sort, которое ваше мнение может прослушивать и соответствующим образом обновлять.

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

this.collection.sort(); 
+0

+1 Спасибо за ответ. Вот что я буду делать. – screenm0nkey

+0

Это, безусловно, лучший ответ здесь. – Chris

Смежные вопросы