我有一个骨干集合和两个按钮。我想要做的是,如果我单击 button1,它应该按名称对集合进行排序,如果单击 button2,它应该按类别排序。
我试过这个
comparator : function(model){
return model.get("Name");
}
我的问题是我的收藏中可以有两个比较器吗?我将如何按名称和类别分别对集合进行排序。有任何想法吗?谢谢
我有一个骨干集合和两个按钮。我想要做的是,如果我单击 button1,它应该按名称对集合进行排序,如果单击 button2,它应该按类别排序。
我试过这个
comparator : function(model){
return model.get("Name");
}
我的问题是我的收藏中可以有两个比较器吗?我将如何按名称和类别分别对集合进行排序。有任何想法吗?谢谢
您可以将排序变量附加到集合并在比较器中使用它:
App.List = Backbone.Collection.extend({
initialize: function() {
this.sortVar = 'Name';
},
comparator: function(model){
return model.get(this.sortVar);
}
})
然后只需在单击链接时更改 sortVar 并调用 sort()。
另一种方法是使用sortBy方法(它来自下划线,但可用于 Backbone.Collection):使用该方法,您只需传入模型属性名称。请注意,sortBy 方法返回一个数组。
在这里,我有一个独立的按钮视图。触发排序事件使其他视图(例如,处理列表呈现的视图)能够响应排序事件并重新呈现自己。
app.ButtonsView = Backbone.View.extend({
el: '#buttons',
events: {
'click #sortByNameBtn' : 'sortByName',
'click #sortByCategoryBtn' : 'sortByCategory'
},
sortByName : function(){
app.mycollection.models = app.mycollection.sortBy('name');
app.mycollection.trigger('sort');
},
sortByCategory : function(){
app.mycollection.models = app.mycollection.sortBy('category');
app.mycollection.trigger('sort');
}
});
参考:http : //backbonejs.org/docs/backbone.html(搜索sortBy)
使用 sortBy不会触发“排序”事件,这就是我自己在集合上触发它的原因。此外,sortBy 可能不适用于 Date 属性或其他排序复杂的属性,因此请使用比较器。