我查看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')];
},
...
});
答案 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;
}
}