Ответ 1
У вас здесь несколько вещей.
Это не делает то, что вы думаете:
if(theorder == 'nooffers') {
Request.comparator = Request.nooffers();
}
Выполняет метод nooffers
и присваивает его результат Request.comparator
. Но sortBy
возвращает отсортированный список:
nooffers : function() {
return this.sortBy(function(ab) {
return ab.get('offers');
});
}
и установка этого списка в качестве функции компаратора не делает ничего полезного.
Вы хотите изменить назначение, чтобы использовать функцию, а не ее возвращаемое значение:
if(theorder == 'nooffers') {
Request.comparator = Request.nooffers;
}
и изменить функцию как действительную функцию компаратора:
nooffers : function(ab) {
return ab.get('offers');
}
Демо (запускается с открытой консолью): http://jsfiddle.net/ambiguous/AAZCa/
Но если кто-то извне возится с подобными методами сбора, это плохо пахнет, и вы не должны этого делать. Вместо этого вы должны попросить коллекцию изменить ее порядок следующим образом:
var Requests = Backbone.Collection.extend({
model: Request,
comparator: function(ab) {
if(this._order_by == 'offers')
return ab.get('offers');
else if(this._order_by == 'id')
return -ab.id;
//...
},
order_by_offers: function() {
this._order_by = 'offers';
this.sort();
},
order_by_default: function() {
this._order_by = 'id';
this.sort();
},
_order_by: 'id'
});
//...
rs.order_by_offers();
Демо: http://jsfiddle.net/ambiguous/uM9av/
Или вы можете позволить коллекции поменять свой собственный comparator
, чтобы избежать всей условной логики внутри comparator
:
var Requests = Backbone.Collection.extend({
model: Request,
initialize: function() {
this._order_by_id = this.comparator;
},
comparator: function(ab) {
return -ab.id;
},
order_by_offers: function() {
this.comparator = this._order_by_offers;
this.sort();
},
order_by_default: function() {
this.comparator = this._order_by_id;
this.sort();
},
_order_by_offers: function(ab) {
return ab.get('offers');
}
});