Backbone: ordre de tri inversé des modèles dans une collection

Créé le 11 avr. 2011  ·  12Commentaires  ·  Source: jashkenas/backbone

Hey,

Quelle est la meilleure façon d'inverser l'ordre de tri d'une collection? mon comparateur trie tous les modèles par date,
mais j'en aurais besoin dans l'ordre inverse. utiliser toArray() et reverse() semble assez moche.

étant donné que je ne manque pas quelque chose d'important ici, je voterais pour un attribut de modèle de dorsale pour définir le
ordre de tri avec le comparateur.

à votre santé,
Daniel

question

Commentaire le plus utile

Tu pourrais aussi faire

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

Tous les 12 commentaires

La meilleure façon d'inverser le tri de la collection est de renvoyer une valeur négative à partir de votre critère de comparaison.

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

Comment cela est-il censé fonctionner lors du tri alphabétique sur une valeur de chaîne?

Si tout ce que vous avez sont des valeurs de chaîne, alors peut-être convertir en une date antérieure?
J'ai eu le même problème et cela l'a résolu.

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

Cela ne fonctionne que pour les dates (qui sont converties en nombres lorsque vous les préfixez avec -), mais pas pour les chaînes arbitraires que vous souhaitez trier par ordre alphabétique.

Vous avez bien sûr raison, j'ai supposé que vous parliez encore de dates (comme l'OP), mais que votre date était une chaîne convertible. Mon erreur alors :).

La prochaine version de Backbone (et le maître actuel) prendra en charge les commandes sort pour les comparateurs (au lieu de seulement sortBy ), vous pourrez donc le définir de la manière habituelle.

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

Que faites-vous si vous avez plusieurs cas d'utilisation pour la même collection, dont certains doivent être affichés dans un ordre et l'autre dans l'ordre inverse? Votre comparateur et vos implémentations de tri ne peuvent choisir qu'une direction ou une autre, il ne semble pas y avoir de Collection.reverse () pour pouvoir changer rapidement de sens de tri (croissant ou décroissant).

@ elwayman02 Vous pouvez simplement maintenir 2 instances de collection (Collection # clone peut aider)

Ce n'est pas particulièrement utile ... prenons par exemple une situation où la collection représente une grille de données que je vais trier à plusieurs reprises dans plusieurs directions. Cela n'a pas de sens d'essayer de maintenir deux sources de données différentes et de basculer entre elles. Il devrait y avoir un objet de données que nous manipulons selon les besoins.

J'ai stocké plusieurs comparateurs sur une collection et les ai échangés au besoin.

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();

C'est une meilleure solution de contournement, même si je ne comprends toujours pas pourquoi une solution de contournement est nécessaire au lieu d'une épine dorsale prenant simplement en charge une méthode reverse ().

Tu pourrais aussi faire

collection.set(collection.models.reverse(), {sort: false});
Cette page vous a été utile?
0 / 5 - 0 notes