Backbone JS复杂模型获取

时间:2012-03-28 20:13:20

标签: javascript backbone.js

我有两个主干模型,从服务器加载:

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 }]
}

1 个答案:

答案 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:

http://jsfiddle.net/QEdmB/44/