在Ember中创建和更新嵌套对象

时间:2014-01-31 19:05:56

标签: javascript ember.js

我从服务器获得了嵌套的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}方法自动完成。也许有更好的方法?

2 个答案:

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

的情况下根据需要对JSON进行任何必要的转换

您还可以覆盖模型load功能,以便在需要时转换收到的数据。 Ember Model源码相当容易阅读,因此不难扩展到您的要求。