我有两个主干模型,从服务器加载:
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 }] }
解决方法
为了能够做到这一点到你的后端 – 它与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' } ] });
当您的Model获取JSON时,它将自动在“子模型”属性下创建一个SubCollection,并使用SubModels填充它 – 一个数组中的每个JSON对象.
骨干关系的jsfiddle:http://jsfiddle.net/4Zx5X/12/
用手
如果你想要的话,你可以手工完成.涉及覆盖您的Model类的parse函数(原谅我,如果我的JS不是100%正确的 – 最近在我的大脑中使用了CoffeeScript)
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’,以使您的序列化版本看起来像您的API所期望的.
的jsfiddle: