парсинг больших данных JSON в и из моделей - PullRequest
0 голосов
/ 12 августа 2011

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

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

верхним уровнем ответа json является массив разделов, поэтому я смог передать его непосредственно в коллекцию разделов, затем я использовал метод initialize для анализа дочерних вопросов, а затем удалил их из атрибутов. Но это означает, что я не получаю возвращение 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);

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

спасибо.

1 Ответ

1 голос
/ 12 августа 2011

Если у вас есть ограниченное количество вложенных моделей, которые находятся под вашим контролем и не подвержены частым изменениям, простой способ - переопределить метод 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, чтобы он всегда анализировал все nestedCollections и добавлял их в объект JSON перед его возвратом.

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

...