在我的应用程序中,我有两种类型的数据:包含项目的组和项目本身。每个项目都分配给一个组,并且可能存在空组(并且必须表示)。这似乎是一个简单的场景,但在这种情况下,我无法找到有关如何设置模型,视图和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相关联的集合(例如组),并且它的模型是否负责创建项目?
编辑:视图将显示多个组,每个组包含零个或多个项目。
答案 0 :(得分:1)
这不是一般可以回答的问题,但您应该记住,每个请求都是额外的开销,迫使用户等待您的应用。所以你应该尽可能避免。
如果您可以选择示例2,那么您可能应该这样做......
答案 1 :(得分:1)
这实际上取决于您计划如何在视图中使用数据模型。
您是否计划在每个视图中显示一个组?如果是,那么拥有一组项目就足够了。如果没有包含项目集合的组的集合更适合。
您是否也在开发后端?如果是的话,以与数据模型相同的方式构造它显然是有意义的。这意味着用于查询所有组的服务和用于查询组内所有项目的服务。如果不是,则需要添加逻辑以从JSON填充数据模型,这是不太理想的情况。
或者您是否在网格中显示数据?在这种情况下,将所有项目放在平面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/