2012-02-23 3 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' 
}, 

Так filter1 и filter2 будет последующая фильтрация, но если фильтры могут быть 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

Спасибо большое, Джош, компаратор, похоже, делает именно то, что мне нужно! как и фильтрация! – Xrender

Смежные вопросы