定义多个比较器,用于对Appcelerator主干模型进行排序和反向排序

时间:2013-06-23 14:54:55

标签: sorting backbone.js model appcelerator comparator

我在新的Alloy实现中定义了一个Appcelerator DataGrid,它依赖于Backbone框架。我已成功实现了水平和垂直滚动DataGrid,它还通过REST查询将数据集合数据集绑定到DataGrid,并允许用户在触摸列标题时对网格进行排序。

我遇到的一个问题就是这个问题。使用Backbone模型实现实现数据模型时,我使用比较器以升序方式对数据模型进行排序。我还扩展了模型以允许用户定义排序条件(传递过滤器的列定义)。

这是一个问题。我知道网格按升序排序的时间。在Backbone模型中是否有可能定义第二个比较器,然后按相反的顺序排序,因此如果用户使用度假,我可以按降序排序(基本上创建两个比较器)?我已经看到了关于反向排序的问题,但没有关于在一个模型中允许两个比较器选项的问题。

我跟随Appcelerator的通用模型就是他们的例子:

exports.definition = {

config : {
    // table schema and adapter information
},

extendModel: function(Model) {      
    _.extend(Model.prototype, {
        // Extend, override or implement the Backbone.Model methods                     
    });
    return Model;
},

extendCollection: function(Collection) {        
    _.extend(Collection.prototype, {

        // Implement the comparator method.
        comparator : function(book) {
            return book.get('title');
        }

    }); // end extend

    return Collection;
}

}

考虑到上述情况,我希望第二次访问比较器,以便在可能的情况下对标题进行反向排序。

感谢任何指导。

克里斯。

1 个答案:

答案 0 :(得分:0)

要按字符串(不区分大小写)或仅数字的降序排序,请尝试以下操作:

var sort_descending = false; /* assuming you are able to set this variable when you need to sort */
var sort_attribute_name = "title"; /* assuming you can set the attribute name on which you want to sort */
book_list.comparator = function(book){ /* book_list is an instance of book_collection */
  if(sort_descending){
    if(isNaN(book.get(sort_attribute_name)){
       var str = book.get(sort_attribute_name);
       str = str.toLowerCase();
       str = str.split("");
       str = _.map(str, function(letter){
          return String.fromCharCode(-(letter.charCodeAt(0))); /* from an SO answer*/
       });
    }
    return -book.get(sort_attribute_name);
  }
  return book.get(sort_attribute_name);
};