Использование магистрального localStorage для вложенной коллекции

Я пытаюсь реализовать вложенные Коллекции точно так же, как пример, который я нашел здесь: /questions/18881763/vlozhennaya-kollektsiya/18881778#18881778

Единственное отличие в том, что я пытаюсь хранить данные локально с помощью плагина localStorage.

Здесь мои списки будут отелями в приведенном выше примере:

var app = app || {};


(function (){
    'use strict';

    // List Collection - list of words
    //---------------------

    var listCollection = Backbone.Collection.extend({
        //referebce to this collection's model
        model: app.ListModel,
        localStorage: new Backbone.LocalStorage('translate-lists')


    });


    app.listCollection = new listCollection();


})();



(function (){
    'use strict';

    app.ListModel = Backbone.Model.extend({

         initialize: function() {
            // because initialize is called after parse
            _.defaults(this, {
                words: new app.wordCollection
            });
        },
        parse: function(response) {
            if (_.has(response, "words")) {
                this.words = new app.wordCollection(response.words, {
                    parse: true
                });
                delete response.words;
            }
            return response;
        }
    });



})();

То, что делает localStorage, хранит ListModels, но если я добавлю что-либо в коллекцию слов, она вскоре исчезнет после обновления.

Есть идеи, как сохранить всю вложенную коллекцию?

1 ответ

Получилось, что это сработало, и дело дошло до синтаксического анализа, но также, если вы хотите убедиться, что вы просто получаете атрибуты из своей вложенной коллекции, вы должны переопределить toJSON, иначе вы получите полную коллекцию в том, что это возвращает.

  Backbone.Model.prototype.toJSON = function() {
    var json = _.clone(this.attributes);
    for (var attr in json) {
      if ((json[attr] instanceof Backbone.Model) || (json[attr] instanceof Backbone.Collection)) {
        json[attr] = json[attr].toJSON();
      }
    }
    return json;
  };

Главное что ломалось - в разборе. Назначает слова непосредственно в модель,

this.words = new app.wordCollection(response.words, {
                    parse: true
                });

но это означает, что он не будет отображаться при вызове toJSON, поскольку его нет в атрибутах (это также означает, что вы не можете получить к нему доступ через model.get)

так что это должно быть изменено на

initialize: function () {
        // because initialize is called after parse
        _.defaults(this.attributes, {
            words: new app.WordCollection()
        });
    },
    parse: function (response) {
        if (_.has(response, "words")) {
            this.attributes.words = new app.WordCollection(response.words, {
                parse: true
            });
            delete response.words;
        }
        return response;
    }

таким образом, он добавляется к атрибутам модели, а не непосредственно к модели. Если вы посмотрите на эту скрипку http://jsfiddle.net/leighking2/t2qcc7my/ и продолжите нажимать, она создаст новую модель в коллекции, сохранит ее в локальном хранилище, а затем выведет результаты на консоль. каждый раз, когда вы нажимаете run, вы должны видеть, что он увеличивается на 1 (поскольку он получает предыдущие результаты локального хранилища) и содержит полную информацию, которую вы хотите.

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