昨晚我刚刚实施了这个。
您可以设置一个新的集合comparator
然后使用sort
方法的集合。 sort
将触发一个reset
事件,您可以在视图中使用该事件来重新呈现列表。
这是我的看法,其中包含一个选择框,允许用户选择如何对数据进行排序:
App.HouseListView = Backbone.View.extend({
el: '.house-list',
initialize: function() {
App.houseCollection.bind('reset', this.populateList, this);
},
events: {
'change .sort':'sort',
},
populateList: function(collection) {
this.$('ul').html('');
_.each(collection.models, function(model) {
var view = new App.HouseListElemView({model:model});
this.$('ul').append(view.el);
});
},
sort: function(e) {
var sort_by = $(e.srcElement.selectedOptions[0]).attr('data-sort-by');
App.houseCollection.comparator = function(house) {
return house.get(sort_by);
}
App.houseCollection.sort();
},
});
希望这有助于
编辑:实现@mu is too short
的建议:
App.Houses = Backbone.Collection.extend({
model: App.House,
url: API_URL,
_sort_by: 'price',
sort_houses_by: function(sort_by) {
this._sort_by = sort_by;
this.sort();
},
comparator: function(house) {
return house.get(this._sort_by);
},
});
App.houseCollection = new App.Houses();
App.HouseListView = Backbone.View.extend({
el: '.house-list',
initialize: function() {
App.houseCollection.bind('reset', this.populateList, this);
},
events: {
'change .sort':'sort',
},
populateList: function(collection) {
this.$('ul').html('');
_.each(collection.models, function(model) {
var view = new App.HouseListElemView({model:model});
this.$('ul').append(view.el);
});
},
sort: function(e) {
var sort_by = $(e.srcElement.selectedOptions[0]).data('sort-by');
App.houseCollection.sort_houses_by(sort_by);
},
});
一个方法收集交换'比较器'和'排序'将是一个更好的方法;那么该方法可以设置'this._sort_by','comparator'将'返回house.get(this._sort_by)'。你可以说'.data('sort-by')'而不是'.attr('data-sort-by')'。 –
更好!非常感谢 – AlexBrand
应该populateList()是render()而不是? – AlexBrand