Коллекция прекрасно отображается при загрузке с удаленного URL, но не при загрузке из localStorage (инициализация против onRender)

Я использую метод инициализации макета для создания экземпляра коллекции, извлечения данных из URL-адреса этой коллекции, а затем для создания нового экземпляра collectionView, проходящего через коллекцию, с полученными данными. Позже collectionView становится "показанным" в регионе.

Работает отлично.

Я хотел переключиться на использование localStorage для извлечения данных, а не из удаленного URL. Поэтому я сохранил данные, полученные из удаленного URL-адреса, в localStorage. Затем я обновил коллекцию 'localStorage: new Backbone.LocalStorage(' records')'. Теперь он успешно получает данные из localStorage. Но. Ни одна из областей в макете не отображается (я пытался вызвать this.render() в разных местах без удачи).

Если я заменим метод 'initialize' на 'onRender' в макете, который отвечает за создание всех экземпляров, то он прекрасно отрисовывается (независимо от того, был ли он получен из удаленного URL-адреса или localStorage).

Почему так получается, что если я использую метод инициализации макета для извлечения данных в коллекции из localStorage, то ничего не отображается; в то время как он отображается, если эти данные выбираются из удаленного URL? почему оба работают при использовании метода onRender?

Некоторый код для справки:

    var EntriesCollection = Backbone.Collection.extend({
        model: EntryModel,
        url: '/api/entries',
        localStorage: new Backbone.LocalStorage('entries')
    });

    return EntriesLayout = Marionette.Layout.extend({

    ...

    // Below, if I use onRender everything works, if I change to 'initialize' then
    // it works only when data is loaded via remote url, not localStorage. (the collection
    // is successfully populated with data in both cases.)

    onRender: function() {

        ...

        this.entries_collection = new EntriesCollection();
        var self = this;
        this.entries_collection.fetch().done(function() {
           /*
            self.entries_collection.localStorage = new Backbone.LocalStorage('entries');
            self.entries_collection.each(function(model) {
                model.save();
            });
            */
            self.entries_list = new EntriesList({collection: self.entries_collection});

            self.collectionSynced();

       });
    },
    collectionSynced: function() {
        this.columnRight.show(this.voting_intro);
        this.collectionList.show(this.entries_list);
        this.listenTo(this.voting_intro, 'start:clicked', function() {
            this.displayEntry(0);
        });
    },

    ...

Я использую макет Marionette, CollectionView, ItemView и т. Д., Не уверен, насколько это важно для вопроса.

0 ответов

Другие вопросы по тегам