在三个模型属性

时间:2016-03-30 17:43:09

标签: javascript sorting backbone.js

我查看http://backbonejs.org/#Collection-comparator并查看了一个模型属性,如示例所示,排序工作正常。但是,我想对多个属性进行排序,以下帖子建议可以针对多个属性进行排序:

Backbone.js collection comparator sort by multiple fields?

comparator: function(item) {
  return [item.get("level"), item.get("title")]
}

我能够按照上面示例中的建议对两个属性进行排序,但是,如果我添加一个附加属性(第三个属性),则排序不会对该第三个属性起作用。

有人可以解释为什么这适用于一个和两个属性,但不适用于三个?

以下是我如何定义比较器:

var aCollection = Backbone.Collection.extend({
    model: Model,
    comparator: function(item){
      return [item.get('uid'), item.get('vid'), item.get('wid')];
    },
    ...
});

1 个答案:

答案 0 :(得分:1)

为了清楚起见,我正在使用带有主干的require.js。为了解决这个问题,我做了大量的谷歌搜索,然后尝试了以下,这是有效的。在加载我的集合时,我创建了一个comparator函数,它接受两个参数。示例:jsfiddle

comparator: function(a, b){

var fields = ['uid','vid','wid'],
            directions = ['asc', 'asc', 'asc'],
            cmpOn;

        cmpOn = _.find(fields, function(c){
           return a.attributes[c] != b.attributes[c];
        });

        if(!cmpOn) return 0;

        if ( ( directions[_.indexOf( fields, cmpOn )] || 'asc' ).toLowerCase() == 'asc' ) {
            return a.attributes[cmpOn] > b.attributes[cmpOn] ? 1 : -1;
        } else {
            return a.attributes[cmpOn] < b.attributes[cmpOn] ? 1 : -1;
        }

}