Reverse sort order with Backbone.js

前端 未结 15 981
不知归路
不知归路 2020-12-02 05:45

With Backbone.js I\'ve got a collection set up with a comparator function. It\'s nicely sorting the models, but I\'d like to reverse the order.

How can I sort the m

15条回答
  •  被撕碎了的回忆
    2020-12-02 06:27

    This can be done elegantly by overriding sortBy method. Here is an example

    var SortedCollection = Backbone.Collection.extend({
    
       initialize: function () {
           // Default sort field and direction
           this.sortField = "name";
           this.sortDirection = "ASC";
       },
    
       setSortField: function (field, direction) {
           this.sortField = field;
           this.sortDirection = direction;
       },
    
       comparator: function (m) {
           return m.get(this.sortField);
       },
    
       // Overriding sortBy (copied from underscore and just swapping left and right for reverse sort)
       sortBy: function (iterator, context) {
           var obj = this.models,
               direction = this.sortDirection;
    
           return _.pluck(_.map(obj, function (value, index, list) {
               return {
                   value: value,
                   index: index,
                   criteria: iterator.call(context, value, index, list)
               };
           }).sort(function (left, right) {
               // swap a and b for reverse sort
               var a = direction === "ASC" ? left.criteria : right.criteria,
                   b = direction === "ASC" ? right.criteria : left.criteria;
    
               if (a !== b) {
                   if (a > b || a === void 0) return 1;
                   if (a < b || b === void 0) return -1;
               }
               return left.index < right.index ? -1 : 1;
           }), 'value');
       }
    
    });
    

    So you can use it like this:

    var collection = new SortedCollection([
      { name: "Ida", age: 26 },
      { name: "Tim", age: 5 },
      { name: "Rob", age: 55 }
    ]);
    
    //sort by "age" asc
    collection.setSortField("age", "ASC");
    collection.sort();
    
    //sort by "age" desc
    collection.setSortField("age", "DESC");
    collection.sort();
    

    This solution does not depend on the field type.

提交回复
热议问题