2012-03-21 13 views
8

Mam listę użytkowników (dokładnie sześć) w kolekcji o właściwościach "firstname", "lastname". Wykonując pobieranie, komparator poniżej sortuje je według "firstname" i działa dobrze.Sortowanie węzła/podkreślenia Nie sortuje kolekcji

Ale jeśli spróbuję posortować kolekcję później, inną wartością, np. "Nazwisko", to nie działa. Zamówienie pozostaje takie samo.

Co robię źle?


Aktualizacja


więc dane zwracane z SortBy jest posortowana ale to nie mi pomóc naprawdę jak mój pogląd jest powiązany z kolekcji. Jeśli zresetuję kolekcję i dodaję posortowaną tablicę z powrotem do kolekcji, to kompilator wykona zadanie i posortuje je z powrotem do porządku "firstname".

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

Odpowiedz

11

Funkcja sortBy nie sortuje obiektów z bieżącego zbioru. Zwraca posortowaną kolekcję:


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

teraz można używać sortedCollection i będzie posortowane prawidłowo.

+0

Dzięki Derick. I dzięki za twoją stronę. To świetny materiał dla programistów. – screenm0nkey

+0

nie jest to, że funkcja komparatora powinna zwracać liczbę całkowitą? –

+2

Należy zwrócić uwagę, że to zwraca listę, a nie kolekcję. Nie jest to wielka sprawa, ale warto wspomnieć. – Chris

3

Podkreślenie na sortBy który wykorzystuje Backbone, powraca uporządkowany zbiór nie rozwiązać go w miejscu ... Aby zilustrować:

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 Dziękujemy za odpowiedź. – screenm0nkey

13

Aby odpowiedzieć na aktualizacji:

Jeśli chce aby zmienić kolejność sortowania kolekcji w celu użycia jej przez odpowiedni widok, można po prostu zaktualizować comparator, a następnie wywołać sort, aby ponownie posortować model. Spowoduje to wystrzelenie zdarzenia o numerze sort, którego twój widok będzie mógł nasłuchiwać i odpowiednio się zaktualizować.

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

this.collection.sort(); 
+0

+1 Dziękujemy za odpowiedź. Tak to zrobię. – screenm0nkey

+0

To zdecydowanie najlepsza odpowiedź tutaj. – Chris

Powiązane problemy