Разбирать вложенные json в базовые коллекции

Я только начинаю с Backbone и я сталкиваюсь с проблемой. У меня приятная спокойная обстановка. Для большинства моих GET запрос Я получаю одну коллекцию моделей, но для одной загружаю вложенные реляционные данные, которые создают вложенные JSON,

В Backbone У меня есть следующее Models:

App.Models.Sequence = Backbone.Model.extend({});
App.Models.Layer = Backbone.Model.extend({});
App.Models.Item = Backbone.Model.extend({});

и эти коллекции

App.Collections.Sequences = Backbone.Collection.extend({
  model: App.Models.Sequence,
  url: '/api/sequences/'
});

App.Collections.Layers = Backbone.Collection.extend({
  model: App.Models.Layer,
  url: '/api/layers'
});


App.Collections.Items = Backbone.Collection.extend({
  model: App.Models.Item,
  url: '/api/items'
});

Я загружаю данные как JSON:

[
              {
                "id": "1",
                "project_id": "8",
                "name": "Seq1",
                "layers": [
                  {
                    "id": "1",
                    "name": "Layer11",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000000",
                        "layer_id": "1",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000001",
                        "layer_id": "1",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000002",
                        "layer_id": "1",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000003",
                        "layer_id": "1",
                        "itemtype_id": "4",
                        "position": "0"
                      }
                    ]
                  },
                  {
                    "id": "2",
                    "name": "Layer12",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000004",
                        "layer_id": "2",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000005",
                        "layer_id": "2",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000006",
                        "layer_id": "2",
                        "itemtype_id": "3",
                        "position": "0"
                      },
                      {
                        "id": "1000007",
                        "layer_id": "2",
                        "itemtype_id": "4",
                        "position": "0"
                      }
                    ]
                  },
                  {
                    "id": "3",
                    "name": "Layer13",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000008",
                        "layer_id": "3",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000009",
                        "layer_id": "3",
                        "itemtype_id": "4",
                        "position": "0"
                      },
                      {
                        "id": "1000010",
                        "layer_id": "3",
                        "itemtype_id": "5",
                        "position": "0"
                      }
                    ]
                  }
                ]
              },
              {
                "id": "2",
                "project_id": "8",
                "name": "Seq2",
                "layers": [
                  {
                    "id": "4",
                    "name": "Layer21",
                    "sequence_id": "2",
                    "items": []
                  },
                  {
                    "id": "5",
                    "name": "Layer22",
                    "sequence_id": "2",
                    "items": []
                  }
                ]
              },
              {
                "id": "3",
                "project_id": "8",
                "name": "Seq3",
                "layers": [
                  {
                    "id": "6",
                    "name": "Layer31",
                    "sequence_id": "3",
                    "items": []
                  },
                  {
                    "id": "7",
                    "name": "Layer32",
                    "sequence_id": "3",
                    "items": []
                  }
                ]
              }
            ]

Как я могу получить Sequences, Layers а также Items в мои коллекции?

1 ответ

Решение

Вы можете использовать комбинацию подчеркивания flatten а также pluck сделать это аккуратно:

var data = { /* your JSON data */ };
var allSequences = _.clone(data);
var allLayers = _.flatten(_.pluck(allSequences, 'layers'));
var allItems = _.flatten(_.pluck(allLayers, 'items'));

var sequences = new App.Collections.Sequences(allSequences);
var layers = new App.Collections.Layers(allLayers);
var items = new App.Collections.Items(allItems);

Если вы не хотите, чтобы последовательности и слои содержали свои дочерние объекты, переопределите Model.parse обрезать их. Например:

App.Models.Sequence = Backbone.Model.extend({
    parse: function(attrs) {
      delete attrs.layers;
      return attrs;
    }
});

И инициализировать / добавить коллекцию с parse:true опция:

var sequences = new App.Collections.Sequences(allSequences, {parse:true});

И так далее.

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