2012-03-21 14 views
8

Ho una lista di utenti (sei per essere precisi) in una collezione con proprietà 'firstname', 'lastname'. Facendo un recupero, il comparatore qui sotto li ordina per "nome" e funziona perfettamente.Backbone/Underscore sortBy non ordina la raccolta

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

Ma se cerco di ordinare la raccolta più tardi, da un valore diverso vale a dire 'cognome', non funziona. L'ordine rimane lo stesso.

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

Cosa sto facendo di sbagliato?


Aggiornamento


Così i dati restituiti dal sortby è ordinato ma questo non mi aiuta veramente come mio punto di vista è legata alla raccolta. Se reimposta la raccolta e aggiungo di nuovo l'array ordinato alla raccolta, il comparatore è il suo lavoro e lo ordina di nuovo nell'ordine 'firstname'.

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

risposta

11

La funzione sortBy non ordina gli oggetti nella raccolta corrente. Si restituisce una raccolta differenziata:


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

Ora è possibile utilizzare sortedCollection e verranno ordinati in modo corretto.

+0

Grazie Derick. E grazie per il tuo sito. È una grande risorsa per gli sviluppatori. – screenm0nkey

+0

non è che la funzione comparatore debba restituire un intero? –

+2

Si noti che questo restituisce un elenco e non una raccolta. Non è un affare enorme ma vale la pena menzionare. – Chris

3

sottolineatura del sortBy che utilizza Backbone, ritorna la raccolta differenziata non ordinare al suo posto ... Facciamo un esempio:

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 Grazie per la risposta. – screenm0nkey

13

per rispondere alle vostre aggiornamento:

Se hai intenzione per modificare l'ordine in cui la raccolta è ordinata per la visualizzazione corrispondente, è possibile aggiornare semplicemente lo comparator e quindi chiamare sort per riordinare il modello. Questo attiverà quindi un evento sort che la tua vista può ascoltare e aggiornare di conseguenza.

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

this.collection.sort(); 
+0

+1 Grazie per la risposta. Questo è quello che farò allora. – screenm0nkey

+0

Questa è sicuramente la migliore risposta qui. – Chris

Problemi correlati