5

我刚刚开始,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,LayersItems进入我的收藏?

4

1 回答 1

8

您可以使用下划线的组合flattenpluck巧妙地做到这一点:

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});

等等。

于 2013-01-16T14:14:27.867 回答