我从服务器获得了嵌套的JSON数据,如下所示:
{
name: "Alice",
profile: {
something: "abc"
}
}
我有以下型号:
App.User = Ember.Object.extend({
name: null,
profile: Ember.Object.extend({
something: null
})
})
如果我只是执行App.User.create(attrs)
或user.setProperties(attrs)
,profile
对象会被普通JS对象覆盖,所以目前我正在这样做:
var profileAttr = attrs.profile;
delete attrs.profile
user.setProperties(attrs); // or user = App.User.create(attrs);
user.get('profile').setProperties(profileAttrs);
它可以工作,但是我已经在一些地方得到了它并且在实际代码中我有多个嵌套对象,所以我想知道是否可以覆盖User#create
和{{1}方法自动完成。也许有更好的方法?
答案 0 :(得分:1)
根据您的评论,您需要使用模型获得的自动合并行为(您使用.extend()
获得的那种行为)。在这种情况下,您可以尝试注册自定义变换器,例如:
App.ObjectTransform = DS.Transform.extend({
deserialize: function(json){
return Ember.Object.create(json);
}
});
App.User = DS.Model.extend({
profile: DS.attr('object')
});
请参阅:https://github.com/emberjs/data/blob/master/TRANSITION.md#json-transforms
答案 1 :(得分:0)
如果您在没有适配器的情况下执行服务器请求,则可以将模型类方法load()
与json对象数组或单个对象一起使用。这将刷新已缓存的任何已知记录,并将JSON藏匿以用于将来基于主键的查找。您也可以使用JSON哈希在模型实例上调用load()
,但它只会更新该单个模型实例。
不清楚为什么你没有使用适配器,你可以扩展其中一个Ember Model适配器并覆盖那里的记录加载,例如。从RESTAdapter
扩展,并在覆盖_loadRecordFromData
您还可以覆盖模型load
功能,以便在需要时转换收到的数据。 Ember Model源码相当容易阅读,因此不难扩展到您的要求。