2012-02-23 57 views
0

在我的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' 
}, 

所以过滤器1和过滤器2将是后续的滤波,但如果过滤器可能是0或100这是不行的。有谁能提供解决方案吗?

回答

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 
    }); 
    }); 
} 
+0

非常感谢Josh,比较器似乎正是我所需要的!过滤也一样! – Xrender 2012-02-24 08:33:22