Backbone: orden inverso de clasificación de modelos en una colección

Creado en 11 abr. 2011  ·  12Comentarios  ·  Fuente: jashkenas/backbone

Oye,

¿Cuál es la mejor manera de invertir el orden de clasificación de una colección? mi comparador ordena todos los modelos por fecha,
pero los necesitaría en orden inverso. usar toArray() y reverse() parece bastante feo.

dado que no me falta algo importante aquí, votaría por un atributo de modelo de red troncal para establecer el
orden de clasificación junto con el comparador.

salud,
daniel

question

Comentario más útil

Tu tambien puedes hacer

collection.set(collection.models.reverse(), {sort: false});

Todos 12 comentarios

La mejor manera de revertir el tipo de colección es devolver un valor negativo de su criterio de comparación.

comparator : function(model) {
  return -model.get('date');
}

¿Cómo se supone que funciona esto cuando se ordena alfabéticamente por un valor de cadena?

Si todo lo que tiene son valores de cadena, ¿tal vez convertir a una fecha anterior?
Tuve el mismo problema y esto lo resolvió.

comparator : function(model) {
  return -new Date(model.get('date'));
}

Eso solo funciona para fechas (que se convierten en números cuando los antepone con -), pero no para cadenas arbitrarias que desea ordenar alfabéticamente.

Por supuesto que tiene razón, asumí que todavía estaba hablando de fechas (como el OP), pero que su fecha era una cadena convertible. Entonces mi error :).

La próxima versión de Backbone (y el maestro actual) admitirá pedidos de sort para comparadores (en lugar de solo sortBy ), por lo que podrá definirlo de la manera habitual.

comparator: function(a, b) {
  ...
}

¿Qué hace si tiene varios casos de uso para la misma colección, algunos de los cuales deben mostrarse en un orden y el otro al revés? Su comparador y las implementaciones de clasificación solo pueden elegir una dirección u otra, no parece haber un Collection.reverse () para poder cambiar rápidamente las direcciones de clasificación (ascendente o descendente).

@ elwayman02 Solo puede mantener 2 instancias de colección (la colección # clon puede ayudar)

Eso no es particularmente útil ... tome por ejemplo una situación en la que la colección representa una cuadrícula de datos que ordenaré repetidamente en múltiples direcciones. No tiene sentido intentar mantener dos fuentes de datos diferentes y cambiar entre ellas. Debe haber un objeto de datos que manipulemos según sea necesario.

He almacenado varios comparadores en una colección y los cambié según sea necesario.

var Collection = Backbone.Collection.extend({
  comparators: {
    a: function () {},
    b: function () {}
  },

  setComparator: function (key) {
    this.comparator = this.comparators[key];
    return this;
  }
});
var collection = new Collection();
collection.setComparator('a').sort();
collection.setComparator('b').sort();

Esa es una mejor solución, aunque todavía no entiendo por qué es necesaria una solución en lugar de que la red troncal simplemente admita un método reverse ().

Tu tambien puedes hacer

collection.set(collection.models.reverse(), {sort: false});
¿Fue útil esta página
0 / 5 - 0 calificaciones