Tengo una colección principal que se representa en una tabla. Me gustaría hacer que la tabla pueda clasificarse según ciertos atributos que tenga la colección, como "task_status", "task_group". He estado leyendo la documentación principal sobre collection.comparator, nd collection.sort. ¿Cómo puedo hacer esto?ordenación de la colección de la red troncal según los atributos del modelo
Respuesta
La función comparator
se utiliza para comparar dos modelos en la colección y puede compararlos de cualquier forma (consistente) que desee. En particular, se puede elegir el modelo de atribuir a utilizar lo que podría tener algo como esto en su colección:
initialize: function() {
this.sort_key = 'id';
},
comparator: function(a, b) {
// Assuming that the sort_key values can be compared with '>' and '<',
// modifying this to account for extra processing on the sort_key model
// attributes is fairly straight forward.
a = a.get(this.sort_key);
b = b.get(this.sort_key);
return a > b ? 1
: a < b ? -1
: 0;
}
y luego sólo tiene algunos métodos para la recogida de cambiar el sort_key
y llame sort
:
sort_by_thing: function() {
this.sort_key = 'thing';
this.sort();
}
En Backbones anteriores, llamar sort
activará un evento "reset"
, mientras que las versiones más recientes activarán un evento "sort"
. Para cubrir ambos casos se puede escuchar a ambos eventos y volver a hacer:
// in the view...
initialize: function() {
this.collection.on('reset sort', this.render, this);
}
Demostración: http://jsfiddle.net/ambiguous/7y9CC/
también puede utilizar listenTo
en lugar de on
para ayudarle a evitar los zombies:
initialize: function() {
this.listenTo(this.collection, 'reset sort', this.render);
}
Demostración: http://jsfiddle.net/ambiguous/nG6EJ/
La respuesta de @mu-es-demasiado-corto es buena, excepto que hay una manera más fácil de comparar el campo valores:
La forma más fácil de ordenar la colección basada en un campo, es proporcionar una función de comparación que devuelve el valor exacto del campo que desea ordenar. Este tipo de comparador hace que Backbone llame a la función sortBy
, en lugar de a sort
, que luego hace esa comparación compleja por sí mismo y no tiene que preocuparse por la lógica.
Por lo tanto, en esencia, no tiene que proporcionar una función de comparador compleja, a menos que tenga una necesidad más avanzada para determinar el pedido.
var myCollection = Backbone.Collection.extend({
sort_key: 'id', // default sort key
comparator: function(item) {
return item.get(this.sort_key);
},
sortByField: function(fieldName) {
this.sort_key = fieldName;
this.sort();
}
});
Después de esto sólo se puede llamar sortByField
-función de la colección con una cadena que representa la clave que desea ordenar. Por ejemplo:
collection.sortByField('name');
Modified @ mi-es demasiado breve demostración de: http://jsfiddle.net/NTez2/39/
Tenga en cuenta que este ejemplo ya no funciona porque Backbone ya no dispara el evento de reinicio en ordenación. Dispara el evento de ordenación. –
¡Gracias por el aviso! Actualicé el ejemplo para acomodar ese cambio: http://jsfiddle.net/NTez2/39/ – jylauril
El gran problema con el comparador de un solo argumento (y '_.sortBy') es que no se puede cambiar entre ordenamiento ascendente y descendente en una cuerda de cualquier manera cuerda. Descender en números es fácil ya que puede negar los números pero negar una cadena no es tan fácil. Tampoco puede ordenar por varias teclas sin mezclarlas en una sola cadena y eso se encarga de hacerlo bien. –
@ respuesta de jylauril ayuda a tremendamente, pero necesita modificar la demo (tal vez ligeros cambios en la columna vertebral, ya que fue publicada ?)
Parece que debe desencadenar un renderizado después de haber ordenado.
$('#by-s').click(function() {
c.sortByField('s');
v.render();
});
Actualizado @ demostración de mi-es demasiado corta: http://jsfiddle.net/NTez2/13/
- 1. Validación del modelo de red troncal
- 2. Evento de restablecimiento de red troncal en la colección
- 3. Sobrescribir la función de análisis de la red troncal
- 4. ¿La red troncal activa .add cuando se recolecta una colección?
- 5. El modelo de red troncal .toJSON() no representa todos los atributos a JSON
- 6. Creación de una vista de red troncal para una colección
- 7. Problema Renderice la colección de la red troncal usando la plantilla de bigote
- 8. Reemplazo del método fetch() en el modelo de red troncal
- 9. Filtrado de red troncal
- 10. implementar correctamente los comparadores de la red troncal
- 11. El evento de clic de red troncal desencadena eventos para toda la colección en lugar del modelo
- 12. Jerarquización de la vista de red troncal
- 13. Eventos de red troncal en el modelo de activación en la recopilación (doble activación)
- 14. Red troncal: colección de recuperación desde el servidor
- 15. buscar en el modelo de red troncal con id
- 16. Creación de modelo de red troncal utilizando datos JSON recibidos
- 17. Actualizar los atributos del modelo
- 18. ¿Eliminar un modelo de red troncal por ID?
- 19. Patrón para administrar vistas en la red troncal
- 20. Cómo borrar la red troncal localstorage
- 21. Vista de red troncal, inicializar y renderizar
- 22. Ordenación de atributos de XML
- 23. ¿Los eventos relacionales de red troncal no se activan?
- 24. Gestión de la respuesta de error del servidor con la red troncal
- 25. Cuál es la diferencia entre inicializar y constructor en un modelo de red troncal
- 26. cómo agregar json a la red troncal, colección js usando fetch
- 27. Recreación de una vista eliminada en la red troncal js
- 28. ¿Cómo eliminar un modelo de red troncal desde el lado del cliente?
- 29. los eventos de la vista de red troncal no funcionan después de volver a renderizar
- 30. red troncal destruir no enviar parámetros
¿Puedo utilizar este modelo en una situación en la que los campos de clasificación son cadenas – MrFoh
@MrFoh: Sí, '>' y '<' trabajo en cadenas, el atributo 's' en la demostración es una cadena. –
Tenga en cuenta que este ejemplo ya no funciona porque Backbone ya no dispara el evento de restablecimiento en ordenación. Dispara el evento de ordenación. –