разбор больших данных json в моделях и из них

У меня есть большой ответ сервера json, который вкладывает модели в модели. У меня нет возможности заставить сервер отдыхать. Мне нужно разобрать дерево json на коллекции и коллекции внутри коллекций. Затем я хотел бы экспортировать магистральные модели в той же структуре json на сервер после модификации.

у меня есть коллекция, называемая разделами, и я использую этот метод для вложения коллекции вопросов в каждую модель раздела: http://documentcloud.github.com/backbone/#FAQ-nested

верхний уровень ответа json представляет собой массив разделов, поэтому я смог передать его непосредственно в коллекцию разделов. Затем я использовал метод инициализации для анализа дочерних вопросов, а затем удалил их из атрибутов. Но это означает, что я не получаю model.questions, возвращаемый в любом toJSON в коллекции разделов.

SCC.Models.Section = Backbone.Model.extend({
    initialize: function() {
        var questions = this.get('questions');
        this.questions = new SCC.Collections.Questions(questions);
        delete this.attributes.questions;

    }
});

SCC.Collections.Sections = Backbone.Collection.extend({
    model: SCC.Models.Section
});

SCC.Sections = new SCC.Collections.Sections();
//imagine window.SectionData is the server response
SCC.Sections.reset(window.SectionData);

Надеюсь, я ясно. Позвольте мне, если вам нужна дополнительная информация.

Благодарю.


person lukemh    schedule 12.08.2011    source источник


Ответы (1)


Если у вас есть ограниченное количество вложенных моделей, которые находятся под вашим контролем и не подлежат частым изменениям, самый простой способ — переопределить метод toJSON() для ваших моделей с вложенными коллекциями:

SCC.Models.Section = Backbone.Model.extend({
    initialize: function() {
        var questions = this.get('questions');
        this.questions = new SCC.Collections.Questions(questions);
        delete this.attributes.questions;
    },
    toJSON: function() {
        var json = Backbone.Model.prototype.toJSON.call(this);
        json.questions = this.questions.toJSON()
        return json
    }
});

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

Я могу подумать, например, о сохранении всех вложенных коллекций в специальном свойстве модели (скажем, nestedCollections), а затем об исправлении обезьяны Backbone.Model.prototype.toJSON, чтобы он всегда анализировал все вложенные коллекции и добавлял их в объект JSON перед его возвратом.

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

person Georgii Ivankin    schedule 12.08.2011