Avec Backbone.js, j'ai une collection configurée avec une fonction de comparaison. C'est bien le tri des modèles, mais j'aimerais inverser l'ordre.
Comment puis-je trier les modèles par ordre décroissant plutôt que par ordre croissant?
javascript
backbone.js
Drew Dara-Abrams
la source
la source
Réponses:
Eh bien, vous pouvez renvoyer des valeurs négatives à partir du comparateur. Si nous prenons, par exemple, l'exemple du site de Backbone et que nous voulons inverser l'ordre, cela ressemblera à ceci:
la source
Personnellement, je ne suis pas très satisfait des solutions proposées ici:
La solution de multiplication par -1 ne fonctionne pas lorsque le type de tri n'est pas numérique. Bien qu'il existe des moyens de contourner cela (en appelant
Date.getTime()
par exemple), ces cas sont spécifiques. Je voudrais une manière générale d'inverser la direction de toute sorte, sans avoir à me soucier du type spécifique du champ à trier.Pour la solution de chaîne, la construction d'une chaîne un caractère à la fois semble être un goulot d'étranglement des performances, en particulier lors de l'utilisation de grandes collections (ou même de grandes chaînes de champ de tri)
Voici une solution qui fonctionne bien pour les champs String, Date et Numeric:
Tout d'abord, déclarez un comparateur qui inversera le résultat d'un résultat d'une fonction sortBy, comme ceci:
Maintenant, si vous voulez inverser le sens du tri, tout ce que nous devons faire est:
La raison pour laquelle cela fonctionne est qu'il
Backbone.Collection.sort
se comporte différemment si la fonction de tri a deux arguments. Dans ce cas, il se comporte de la même manière que le comparateur passéArray.sort
. Cette solution fonctionne en adaptant la fonction sortBy à un seul argument dans un comparateur à deux arguments et en inversant le résultat.la source
Le comparateur de collection de Backbone.js repose sur la méthode Underscore.js _.sortBy. La façon dont sortBy est implémenté finit par «envelopper» javascript .sort () d'une manière qui rend difficile le tri des chaînes en sens inverse. Une simple négation de la chaîne finit par renvoyer NaN et rompt le tri.
Si vous devez effectuer un tri inversé avec des chaînes, comme un tri alphabétique inversé, voici une façon vraiment hackish de le faire:
Ce n'est en aucun cas joli, mais c'est un "négateur de chaîne". Si vous n'avez aucun scrupule à modifier les types d'objets natifs en javascript, vous pouvez clarifier votre code en extrayant le négateur de chaîne et en l'ajoutant en tant que méthode sur String.Prototype. Cependant, vous ne voudrez probablement le faire que si vous savez ce que vous faites, car la modification de types d'objets natifs en javascript peut avoir des conséquences imprévues.
la source
Ma solution était d'inverser les résultats après le tri.
Pour éviter le double rendu, effectuez d'abord le tri avec silencieux, puis déclenchez 'reset'.
la source
-Date.getTime()
, éventuellement avec un piratage supplémentaire si vous pensez que les dates de votre système traverseront l'époque Unix. Pour l'ordre alphabétique, regardez la réponse d'Andrew ci-dessus.Modifiez votre fonction de comparaison pour renvoyer une valeur proportionnelle inversée au lieu de renvoyer les données que vous êtes actuellement. Un peu de code de: http://documentcloud.github.com/backbone/#Collection-comparator
Exemple:
la source
Ce qui suit a bien fonctionné pour moi:
la source
J'en ai lu où la fonction de comparaison Backbone utilise ou imite la fonction JavaScript Array.prototype.sort (). Cela signifie qu'il utilise 1, -1 ou 0 pour décider de l'ordre de tri de chaque modèle de la collection. Cela se met constamment à jour et la collection reste dans le bon ordre en fonction du comparateur.
Des informations sur Array.prototype.sort () peuvent être trouvées ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?redirectlocale=en-US&redirectslug=JavaScript% 2FReference% 2FGlobal_Objects% 2FArray% 2Fsort
De nombreuses réponses à cette question inversent simplement l'ordre juste avant de le rendre sur la page. Ce n'est pas idéal.
En utilisant l'article ci-dessus sur Mozilla comme guide, j'ai pu garder ma collection triée dans l'ordre inverse en utilisant le code suivant, puis nous rendons simplement la collection à la page dans son ordre actuel et nous pouvons utiliser un indicateur (reverseSortDirection) pour inverser l'ordre .
Comparateur à l'exception des deux modèles, lors des modifications apportées à la collection ou au modèle, la fonction de compartiment s'exécute et change l'ordre de la collection.
J'ai testé cette approche avec Numbers and Strings et cela semble fonctionner parfaitement pour moi.
J'espère vraiment que cette réponse pourra vous aider car j'ai lutté avec ce problème à plusieurs reprises et finit généralement par utiliser un travail de contournement.
la source
sortKey
etreverseSortDirection
et appeler à.sort()
partir de n'importe quelle vue qui a une poignée sur la collection. Plus simple que d'autres réponses aux votes plus élevés, pour moi.Cela peut être fait avec élégance en remplaçant la méthode sortBy. Voici un exemple
Vous pouvez donc l'utiliser comme ceci:
Cette solution ne dépend pas du type de champ.
la source
la source
Voici une solution vraiment simple, pour ceux qui veulent simplement inverser l'ordre actuel. C'est utile si vous avez une table dont les colonnes peuvent être ordonnées dans deux directions.
Vous pouvez le combiner avec quelque chose comme ceci si vous êtes intéressé par le cas de table (coffeescript):
la source
Pour l'ordre inverse sur id:
la source
J'avais une exigence légèrement différente, en ce que j'affiche mes modèles dans un tableau, et je voulais pouvoir les trier par n'importe quelle colonne (propriété du modèle) et soit par ordre croissant soit par ordre décroissant.
Il a fallu beaucoup de temps pour que tous les cas fonctionnent (où les valeurs peuvent être des chaînes, des chaînes vides, des dates, des nombres. Cependant, je pense que c'est assez proche.
utilisation:
la source
Je viens de remplacer la fonction de tri pour inverser le tableau des modèles à la fin. J'ai également retardé le déclenchement de l'événement «sort» jusqu'à ce que l'inverse soit terminé.
la source
Récemment rencontré ce problème et vient de décider d'ajouter une méthode de tri.
J'espère que quelqu'un trouvera cela utile
la source
Voici un moyen rapide et facile de trier à l'envers les modèles d'une collection à l'aide de UnderscoreJS
la source