2012-03-21 14 views
8

Tengo una lista de usuarios (seis para ser exactos) en una colección con propiedades 'firstname', 'lastname'. Al hacer una búsqueda, el comparador a continuación los clasifica por 'firstname', y funciona bien.Backbone/Underscore tipoSi no está ordenando la colección

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

Pero si trato de ordenar la recogida más tarde, por un valor diferente es decir, 'apellido', que no funciona. El orden permanece igual.

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

¿Qué estoy haciendo mal?


actualización


Así que los datos devueltos por sortBy está ordenada pero eso no me ayuda realmente como mi punto de vista está vinculado a la colección. Si reinicio la colección y vuelvo a agregar la matriz ordenada a la colección, su comparador hace su trabajo y lo ordena de nuevo en el orden 'firstname'.

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

Respuesta

11

La función sortBy no ordena los objetos de la colección actual. Devuelve una colección ordenada:


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

Ahora puede utilizar sortedCollection y se ordenará correctamente.

+0

Gracias Derick. Y gracias por tu sitio. Es un gran recurso para desarrolladores. – screenm0nkey

+0

¿No es que la función de comparación debe devolver un número entero? –

+2

Tenga en cuenta que esto devuelve una lista y no una colección. No es un gran problema, pero vale la pena mencionarlo. – Chris

3

de Subrayado sortBy que utiliza Backbone, vuelve la colección ordenada no ordena en su lugar ... Para ilustrar:

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 Gracias por la respuesta. – screenm0nkey

13

para responder a su actualización

Si estás queriendo para cambiar el orden en que se ordenó la colección para que sea utilizada por su vista correspondiente, puede actualizar el comparator y luego llamar al sort para obtener el modelo reordenado. Esto disparará un evento sort que su vista puede escuchar y actualizarse en consecuencia.

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

this.collection.sort(); 
+0

+1 Gracias por la respuesta. Eso es lo que haré entonces. – screenm0nkey

+0

Esta es definitivamente la mejor respuesta aquí. – Chris

Cuestiones relacionadas