骨干路由 - 排序和过滤

时间:2012-02-23 20:58:36

标签: backbone.js routes

在我的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,则这将不起作用。有人能提供解决方案吗?

1 个答案:

答案 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
    });
  });
}