Backbone.js:一个嵌套的JSON响应或多个JSON响应?

时间:2014-01-24 14:56:47

标签: javascript json backbone.js nested models

在我的应用程序中,我有两种类型的数据:包含项目的组和项目本身。每个项目都分配给一个组,并且可能存在空组(并且必须表示)。这似乎是一个简单的场景,但在这种情况下,我无法找到有关如何设置模型,视图和JSON响应的信息。

同时拥有一个组合集和一个项集合是否明智,并为每个集合包含一个单独的JSON URL? JSON响应看起来像,例如:

[ { "id": 1,
    "name": "Group A"
  },
  { "id": 2,
    "name": "Group B"
  },
  { "id": 3,
    "name": "Group C"
  } ]

[ { "id": 1,
    "group_id": 1,
    "name": "Item A"
  },
  { "id": 2,
    "group_id": 1,
    "name": "Item B"
  },
  { "id": 3,
    "group_id": 2,
    "name": "Item C"
  } ]

在这种情况下,如何处理两个相互关联的JSON对象的异步加载?

或者,我应该将服务器上的这些数据合并到一个JSON响应中吗?在这种情况下,如果可行,只有一个与JSON URL相关联的集合(例如组),并且它的模型是否负责创建项目?

编辑:视图将显示多个组,每个组包含零个或多个项目。

3 个答案:

答案 0 :(得分:1)

这不是一般可以回答的问题,但您应该记住,每个请求都是额外的开销,迫使用户等待您的应用。所以你应该尽可能避免。

如果您可以选择示例2,那么您可能应该这样做......

答案 1 :(得分:1)

这实际上取决于您计划如何在视图中使用数据模型。

  1. 您是否计划在每个视图中显示一个组?如果是,那么拥有一组项目就足够了。如果没有包含项目集合的组的集合更适合。

  2. 您是否也在开发后端?如果是的话,以与数据模型相同的方式构造它显然是有意义的。这意味着用于查询所有组的服务和用于查询组内所有项目的服务。如果不是,则需要添加逻辑以从JSON填充数据模型,这是不太理想的情况。

  3. 或者您是否在网格中显示数据?在这种情况下,将所有项目放在平面JSON中可能完全没问题。

答案 2 :(得分:1)

这是我在过去的项目中一直使用的模式

在你的情况下,我让服务器返回一个groups json,其中包含嵌套在里面的项目,例如:

[
  {
    'id': 1,
    'name': 'Group A',
    'items': [
      {
        'id': 1,
        'name': 'item A'
      },
      {
        'id': 2,
        'name': 'item B'
      }
    ]
  },
  {
    'id': 2,
    'name': 'Group B',
    'items': [
      {
        'id': 4,
        'name': 'item D'
      }
    ]
  },
  {
    'id': 3,
    'name': 'Group C',
    'items': []  //emtpy
  }
]

在Backbone模型中,您可以将每个嵌套项数组解析为items集合:

var Group = Backbone.Model.extend({
  parse: function (data) {
    data.items = new Items(data.items);
    return data;
  }
});

因此,在初始化集合时,请记住将{parse:true}传递给选项:

var groups = new Groups([...], {parse: true});

或者您可以覆盖模型中的构造函数以强制解析始终为true:

var Group = Backbone.Model.extend({
  constructor: function(attributes, options) {
    options = options || {};
    options.parse = true;
    Backbone.Model.call(this, attributes, options);
  },

  parse: function () { ... }
});

我通常使用强制解析创建一个单独的模型,并通过扩展模型来创建模型,以避免在任何地方使用它。

然后在此集合中,对于每个group,您将拥有一个嵌套的Items集合,

group.get('items');   //is a backbone collection

您可以将其传递给子视图以呈现每个单独的项目。

您仍然可以在项目/组中维护不同的路由(没有嵌套路由),如果您需要保存/销毁每个项目,该操作不会干扰其组或其他项目。

示例jsfiddle在这里:http://jsfiddle.net/4LNXz/