Использование магистрального 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 (поскольку он получает предыдущие результаты локального хранилища) и содержит полную информацию, которую вы хотите.