我有一个链接到两个子模型的模型,如下所示:
var SubModel = Backbone.Model.extend({
defaults: {
headline: null,
image_url: null,
url: null
}
});
var MainModel = Backbone.Model.extend({
defaults: {
subModelA: null,
subModelB: null,
title: null
},
urlRoot: function() {
if (this.isNew()) {
return '/mainmodel/new';
}
return '/mainmodel';
},
initialize: function() {
this.fetch();
},
parse: function(data) {
var response = {};
response.subModelA = new SubModel(data.subModelA);
response.subModelB = new SubModel(data.subModelB);
response.title = data.title;
return response;
}
});
我目前遇到的问题是,调用var mainModelInstance = new MainModel()
可以从/mainmodel/new
正确获取,但mainModelInstance.attributes
始终是空白对象{}
。
var mainModelInstance = new MainModel();
mainModelInstance.attributes; // Returns {}
以下是服务器对/mainmodel/new
的回复示例:
{
"title": "Politics",
"subModelA": {
"headline": "Investigators: Iran tried to smuggle suicide belts, missiles by boat into Yemen",
"url": "http://dailycaller.com/2013/02/09/yemen-minister-says-weapons-came-from-iran/",
"image_url": "http://cdn01.dailycaller.com/wp-content/uploads/2013/02/54c7d52e1a384db489ab9ea568afddb0-e1360455589316.jpg"
},
"subModelB": {
"headline": "Review: Who needs Windows RT? Acer's Iconia W510 runs the real thing",
"url": "http://arstechnica.com/gadgets/2013/02/review-who-needs-windows-rt-acers-iconia-w510-runs-the-real-thing/",
"image_url": "http://cdn.arstechnica.net/wp-content/uploads/2013/02/w510-main-640x388.jpg"
}
}
好像模型的属性没有通过parse
更新。为什么不更新模型的属性?
答案 0 :(得分:6)
您的代码也可能有效,但您没有正确测试
您正在初始化方法中调用this.fetch
。
调用model.fetch
是一个异步调用,当您尝试评估mainModelInstance.attributes
时,http请求调用尚未完成。
你应该用以下方法测试:
var mainModelInstance = new MainModel();
mainModelInstance.on('change', function() {
console.log(mainModelInstance.toJSON());
});
甚至更好,不要自动获取initialize
(这不是最佳做法)
并使用jQuery promise模式:
var mainModelInstance = new MainModel();
mainModelInstance.fetch().done(function () {
console.log(mainModelInstance.toJSON());
});
答案 1 :(得分:3)
这只是一个正在进行中的工作回答,请随时在评论中讨论。
我会改变你的MainModel
定义:
subModelA: new SubModelA(),
subModelB: new SubModelB(),
parse: function(data){
this.subModelA.set(data.subModelA);
this.subModelB.set(data.subModelB);
return data; // we keep two copies of the data, in mainModel and submodels.
}
因此,假设您的服务器响应与您的答案完全相同
var model = new MainModel();
model.get('title'); // Politics
model.subModelA.get('headline'); // Investigators: Iran tr...
然后,您可能必须覆盖save方法,具体取决于您希望如何将内容保留回服务器 - 这可能会有效。
save: function(key, val, options) {
this.set({
subModelA: this.subModelA.toJSON(),
subModelB: this.subModelB.toJSON()
});
Backbone.Model.prototype.save.apply(this, arguments);
}
答案 2 :(得分:1)
首先,必须将默认属性值放入defaults
选项中,如下所示:
var SubModel = Backbone.Model.extend({
defaults: {
headline: null,
image_url: null,
url: null
}
});
然后,在创建新实例时,您将有价值保存到服务器。这也会填满你的mainModelInstance.attributes
哈希。
对于解析问题,您是否记录了从服务器返回的内容(console.log
)?