这是因为当你使用 fetch() 时,服务器只返回一个带有模型属性和嵌套模型属性的 JSON 对象。例如,服务器返回:
{
id: "1",
name: "Model",
nestedModel: {
id: "12",
name: "nestedModel"
}
}
backbone 不够聪明,无法确定 nestedModel 实际上是一个“模型”。它将“nestedModel”视为模型上的一个属性。 (它只是一个普通的 JSON 对象,不是骨干对象)
这就是为什么:
model.attributes.nestedModel.attributes.attributeName
不起作用。
要使其工作,您必须将nestedModel 实例化为Backbone 模型。所以在 fetch 完成后:(假设你的 nestedModel 是 NestedModel 的一个实例)
model.fetch().done(function() {
model.set('nestedModel', new NestedModel(model.get('nestedModel')));
});
您可以通过覆盖 parse() 方法让主干自动为您执行此操作。
在你的模型中:
var NestedModel = Backbone.Model.extend({
//your nested model methods
});
var Model = Backbone.Model.extend({
//do other model stuff
parse: function(response) {
response.nestedModel = new NestedModel(response.nestedModel);
return response;
}
});
这应该使您的陈述有效。
但通常我会使用
model.get('nestedModel').get('attributeName')
有关解析的更多信息,请参见此处:http://backbonejs.org/#Model-parse
为了更灵活地将这种模式应用到所有其他模型中,您可能想阅读以下内容:
http://www.devmynd.com/blog/2013-6-backbone-js-with-a-spine-part-2-models-and-collections