在我的Backbone应用程序中,在我的集合中,我有很多排序方法,当基于集合渲染视图时,我正在通过路径使用全局变量集(我使用全局变量集合,其他操作添加到集合中)我想要使用最后的订购)。例如
routes : {
"" : "index",
'/ordering/:order' : 'ordering'
},
ordering : function(theorder) {
ordering = theorder;
listView.render();
},
然后在我看来
if (typeof ordering === 'undefined') {
d = this.collection.ordered();
}
else if(ordering == 'owners') {
d = this.collection.owners();
}
_.each(d, function(model){
model.set({request : self.model.toJSON()});
var view = new TB_BB.OfferItemView({model : model});
els.push(view.render().el);
});
订购时,所有者是2种订购方式。
所以我的第一个问题是,根据路线,有人可以建议更好的实施方式吗?这个视图在多个地方呈现,因此我使用全局而不是将有序的var传递给方法?
第二个问题是 - 我还想添加一些过滤,所以我想说我想按'价格'排序,但也做一些过滤(比方说多个类别ID)。我怎样才能添加灵活的“路线”来处理过滤。
我想我能做到
routes : {
"" : "index",
'/ordering/:order/:filter1/:filter2' : 'ordering'
},
所以filter1和filter2将是后续过滤,但如果过滤器可能是0或100,则这将不起作用。有人能提供解决方案吗?
答案 0 :(得分:3)
那么,首先你应该使用Backbone的内置功能来自动排序集合。您可以通过在集合中定义comparator
函数来利用此功能。这为您提供了开箱即用的各种胜利 - 例如,每次根据您的comparator
添加或删除某些内容时,该集合都会重新排序。如果要定义多个排序函数,只需将它们全部定义为函数,然后在需要时更新comparator
。然后你可以放弃那个丑陋的全球var
。
对于你的第二个问题,我不完全确定你的意思是“如果过滤器可能是0或100,那么这将无效。”如果你没有指定所有过滤器,那么你会遇到麻烦,那是真的。但是你可以使用通配符来解决这个问题。这可能是这样的:
// your routes look like this:
routes : {
'/ordering/:order/filters/*filters' : 'ordering' // your routes will look like: /ordering/price/filters/filter_one/filter_two/filter_three
},
ordering: function (order, filters) {
filters = filters.split('/'); // creates an array of filters: ['filter_one', 'filter_two', 'filter_three']
listView.render(filters); // pass your filters to the view
}
// listView.render() looks like this:
render: function(filters) {
collection = this.collection;
_.each(filters, function (filter) {
collection = collection.filter(function () {
// your actual filtering code based on what the filter is
});
});
}