似乎ember数据有很多变化到版本1.0 beta。所有版本都适用于版本0.13。现在我想更新到更高版本。在我的例子中,我们有一个嵌入式模型'user'
App.Post = DS.Model.extend({
subject: DS.attr('string'),
created: DS.attr('number'),
fcreated: function(){
debugger;
var d = new Date(this.get('created'));
return d.toLocaleDateString();
}.property('created'),
reporter: DS.belongsTo('user')
}
App.ApplicationAdapter = DS.RESTAdapter.extend({
namespace: 'restws'
});
来自服务器的Json看起来像这样。
{
"posts": [
{
"id": "5226f2670364e70ae7d77266",
"subject": "Text",
"created": 1325410935048,
"reporter": {
"id": "5226f2660364e70ae7d771e2",
"firstName": "Doris",
"lastName": "Baumertr"
}
}
我得到以下错误代码'Uncaught TypeError:无法调用方法'toString'of undefined'。在ember源代码中,我看到,在ember-data.js第2236行,函数抛出错误'buildRecord:function(type,id,data)..'调试后我看到属性类型是未定义的id设置为正确的id和数据是不确定的?
错误是什么?我如何映射嵌入数据?
答案 0 :(得分:2)
这实际上是您需要实现的确切的extractSingle方法
App.PostSerializer = DS.RESTSerializer.extend({
extractSingle: function(store, type, payload, id, requestType) {
if(typeof payload.post.reporter !== "undefined") {
var reporter_id = payload.post.reporter.id;
payload.users = [payload.post.reporter];
payload.post.reporter = reporter_id;
}
return this._super.apply(this, arguments);
}
});
这是一个jsbin http://jsbin.com/EKItexU/1/edit?html,js,output
注意,我必须在RESTAdapter中重新定义ajax方法以模拟返回JSON的服务器。
此外,如果您在JSON中加载用户,那么您必须更新此方法,以便它不会覆盖有效负载中的侧载用户(payload.users属性)
答案 1 :(得分:1)
对嵌入式记录的支持已经消失(现在)。
您可以通过实施extractSingle
并重新组织JSON有效负载来自行处理嵌入式记录。
请阅读此处了解有关过渡的更多信息:https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records
希望它有所帮助。