Backbone.js - Фильтрация коллекций против нескольких коллекций - PullRequest
3 голосов
/ 25 марта 2012

Я создаю файловый менеджер, используя backbone.js. Это часть CMS (системы управления контентом), которую я создаю, и доступ к ней осуществляется через лайтбокс / модальное окно. Мне нужно показать как файлы, прикрепленные к определенному типу контента (например, сообщение), так и все файлы в целом.

На данный момент у меня есть две отдельные коллекции: libraryCollection (все файлы) и galleryCollection (файлы записей). Первая проблема, с которой я столкнулся при использовании этого метода: редактирование файла в libraryCollection и привязка события изменения модели к представлению, очевидно, не влияет на представление galleryCollection.

Есть ли лучший способ сделать это? Я думаю, мне понадобится нумерация страниц для библиотеки LibraryCollection (как в случае РЕАЛЬНОЙ нумерации страниц только с количеством хх результатов, полученных с сервера), и это может усложнить ситуацию. Разве загрузка тысяч записей в коллекцию - это нормально?

Обновление:

Самым быстрым (возможно, самым грязным) методом было использование встроенной системы Backbone.Events. Пример кода:

var aggregator = {};
_.extend(aggregator, Backbone.Events);

aggregator.on("fileUpdated", function(model){
    if(app.libraryCollection && app.galleryCollection){
        libraryModel = app.libraryCollection.get(model.get("id"));
        galleryModel = app.galleryCollection.get(model.get("id"));
        libraryModel.set(model.attributes);
        galleryModel.set(model.attributes);
    }   
});

Затем в редакторе:

window.EditorView = Backbone.View.extend({

    saveModel: function(){
        self = this;
        form = $(this.el).find("form").serializeArray();
        _.each(form, function(field){
            self.model.set(field["name"], field["value"]);
        });
        self.model.save();
        aggregator.trigger("fileUpdated", this.model);
    }
});

Это синхронизирует модели в обеих коллекциях, и поскольку я связал событие изменения модели с функцией рендеринга (не показана), представление отражает изменения как в представлении библиотеки, так и в представлении галереи.

1 Ответ

3 голосов
/ 25 марта 2012

Одним из возможных решений вашей проблемы связи между отдельными компонентами Backbone.js является для нас агрегатор событий. В шаблоне агрегатора событий такие компоненты, как представления, будут иметь общую ссылку на агрегатор, который является объектом, служащим центральным узлом связи для вашего приложения. Вместо представления, подписывающегося на события в другом представлении, оба обращаются к агрегатору, который передает сообщения любому компоненту, который подписывается на этот тип сообщения.

Например, ваш libraryCollection может вызвать событие fileAdded на агрегаторе, передав новый объект file в сообщении. Ваш galleryCollection будет подписываться на событие fileAdded на агрегаторе, и при запуске он будет выполнять некоторые действия, такие как обновление себя с сервера или добавление переданного объекта file к себе.

Вот отличное сообщение в блоге , которое описывает шаблон агрегатора событий.

Загрузка тысяч записей в коллекцию одновременно звучит как рецепт для неприятностей.

...