我有两个主干模型,从服务器加载:
var Model = Backbone.Model.extend({});
var SubModel = Backbone.Model.extend({});
var SubCollection = Backbone.Collection.extend({
model: SubModel
});
var m = new Model();
m.fetch({success: function(model)
{
model.submodels = new SubCollection();
model.submodels.url = "/sub/" + model.get("id");
model.submodels.fetch();
}});
因此,服务器必须发送两个单独的响应。例如:
{ name: "Model1", id: 1 } // For Model fetch
和
[{ name: "Submodel1", id: 1 }, { name: "Submodel2", id: 2 }] // For Submodel collection fetch
有没有办法一次性获取Submodel集合的Model实例,例如:
{
name: "Model1",
id: 1,
submodels: [{ name: "Submodel1", id: 2 }, { name: "Submodel1", id: 2 }]
}
答案 0 :(得分:11)
能够做到这一点取决于你的后端 - 它与Backbone没有任何关系。
您是否可以配置后端技术以将相关模型作为嵌套资源返回?
例如,如果您的后端是Rails,并且您的模型与ActiveRecord相关,那么执行此操作的一种方法就像
respond_to do |format|
format.json { render :json => @model.to_json(:include => [:submodels])}
end
您使用的是哪种后端技术?
修改强>
很抱歉,误解了你的问题的主旨,一旦你的后端以正确的格式返回JSON,是的,你需要在Backbone中做些事情才能处理它。
<强>骨干 - 关系强>
处理它的一种方法是使用Backbone-Relational,一个用于处理相关模型的插件。
您可以通过“关系”属性定义相关模型:
SubModel = Backbone.RelationalModel.extend({});
SubCollection = Backbone.Collection.extend({
model: SubModel
});
Model = Backbone.RelationalModel.extend({
relations: [
{
type: 'HasMany',
key: 'submodels',
relatedModel: 'SubModel',
collectionType: 'SubCollection'
}
]
});
当你的模型获取JSON时,它将自动在'submodels'属性下创建一个SubCollection,并用SubModels填充它 - 一个用于数组中的每个JSON对象。
骨干关系的jsfiddle:http://jsfiddle.net/4Zx5X/12/
手动
如果您愿意,也可以手动完成。涉及覆盖模型类的parse函数(如果我的JS不是100%正确的话,请原谅我 - 最近我在脑中做了很多硬连线)
var Model = Backbone.Model.extend({
parse: function(response) {
this.submodels = new SubCollection();
// Populate your submodels with the data from the response.
// Could also use .add() if you wanted events for each one.
this.submodels.reset(response.submodels);
// now that we've handled that data, delete it
delete response.submodels;
// return the rest of the data to be handled by Backbone normally.
return response;
}
});
parse()在initialize()之前运行,并且在设置属性哈希之前运行,因此您无法访问model.attributes,并且model.set()失败,因此我们必须将集合设置为模型,而不是您将使用get / set访问的“属性”。
根据您在“save()”上想要发生的事情,您可能必须覆盖“toJSON”以使模型的序列化版本看起来像您期望的那样。
<强>的jsfiddle:强>