2 коллекции backbone.js с одинаковыми моделями, но с разными порядками сортировки
Я должен отображать одну и ту же коллекцию моделей магистрали в 2 разных местах на одной странице (один раз в навигации, один раз в основной области), и мне нужно держать модели в коллекциях синхронизированными, но разрешать сортировку каждой коллекции по-другому. Навигация всегда осуществляется в алфавитном порядке по возрастанию, но сортировка в основной области содержимого настраивается пользователем. Какой лучший способ сделать это? Нужно ли мне иметь 2 разные коллекции и привязки событий, чтобы убедиться, что их модели всегда идентичны (используя события добавления / удаления / сброса)? Должен ли я иметь только 1 коллекцию и менять ее порядок сортировки на лету по мере необходимости?
3 ответа
Я обычно считаю, что коллекции не должны быть изменены, чтобы представлять временное переупорядочение, поэтому:
- мнения слушают коллекцию для обычных событий,
- представления извлекают пользовательский список моделей, отсортированных по мере необходимости, когда они должны отображаться.
Например,
var C = Backbone.Collection.extend({
comparator: function (model) {
return model.get('name');
},
toJSON_sorted: function (reversed) {
var models = this.toJSON();
return (!reversed) ? models : models.reverse();
}
});
var V = Backbone.View.extend({
initialize: function () {
this.collection.on('reset', this.render, this);
this.collection.on('change', this.render, this);
this.collection.on('add', this.render, this);
this.collection.on('delete', this.render, this);
}
});
var NavView = V.extend({
render : function () {
console.log(this.collection.toJSON());
}
});
var MainView = V.extend({
render : function () {
var data = this.collection.toJSON_sorted(this.reversed);
console.log(data);
}
});
Называя эти определения
var c=new C();
var v1 = new NavView({collection:c});
var v2 = new MainView({collection:c});
v2.reversed=true;
c.reset([
{name:'Z'},
{name:'A'},
{name:'E'}
]);
обеспечивает представления с моделями в ожидаемом порядке и позволяет вам изменить направление сортировки по желанию. Вы также можете адаптировать toJSON_sorted
обрабатывать сортировку по другим полям.
Скрипка для игры с http://jsfiddle.net/nikoshr/Yu8y8/
Если коллекции содержат одно и то же, я думаю, что хранить одну коллекцию и использовать ее для обоих дисплеев - самое аккуратное. Просто вызовите функцию сортировки, прежде чем визуализировать любой визуальный компонент, который вы хотите.
Все, что вам нужно сделать, это изменить функцию компаратора. У вас есть методы в вашей коллекции, чтобы сделать это, но основная идея
var mycollection = new Backbone.Collection();
mycollection.comparator = function(item) { return item.get('blah') }