Date de backbone + autres paramètres de tri

Donc, cela fonctionne:

comparator: function(model) { if(this.activeSort == "time_created") { return -(Date.parse(model.get('time_created')) || 1); } else { var sort = [ model.get('title'), model.get('category'), ]; return sort; } } 

Mais si je veux trier par "time_created" et les autres paramètres (titre, catégorie), le tri ne fonctionne plus. Je ne peux pas comprendre!

Fondamentalement, je veux que cela fonctionne:

 comparator: function(model) { if(this.activeSort == "time_created") { var sort = [ // date descending -(Date.parse(model.get('time_created')) || 1), model.get('title'), model.get('category'), ]; return sort; } else { var sort = [ model.get('title'), model.get('category'), ]; return sort; } } 

Vous devriez vraiment utiliser un comparateur à deux arguments. Le renvoi d'un tableau n'est pas un bon moyen de faire fonctionner un comparateur à un seul argument en tant que comparateur multi-attributs, principalement parce qu'il ne fonctionne tout simplement pas de façon fiable (comme vous l'avez découvert).

Alors:

 comparator: function(o1, o2) { var v1, v2; if (this.activeSort == "time_created") { v1 = Date.parse(o1.get("time_created")) || 1; v2 = Date.parse(o2.get("time_created")) || 1; if (v1 > v2) return -1; if (v2 > v1) return 1; } v1 = o1.get("title"); v2 = o2.get("title"); if (v1 < v2) return -1; if (v2 < v1) return 1; v1 = o1.get("category"); v2 = o2.get("category"); if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; }