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') }
Другие вопросы по тегам