昨晚我剛剛實施了這個。
您可以設置一個新的集合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