使用Ember数据反序列化复杂模型

时间:2015-10-24 05:11:05

标签: ember.js ember-data

我只有一次调用服务器,它返回我的应用程序的整个数据

[
  {
    "id": 1,
    "count": 0,
    "canGroup": true,
    "childs": {
      "group": [
        {
          "id": 0,
          "count": 3,
          "canGroup": true,
          "childs": {
            "user": [
              {
                "id": 0,
                "count": 3,
                "canGroup": true
              }
              ...
            ]
        }
      ]  ...
    }    
    ...
]

如何使用Ember Data反序列化此模型?

1 个答案:

答案 0 :(得分:1)

这个问题分为两部分。一个是如何构建模型来表示这些数据,第二个是如何修改传入的数据,以便Ember可以处理它。该模型,我们称之为group,类似于:

// models/group.js
export default DS.Model.extend({
  count: DS.attr(),
  canGroup: DS.attr(),
  childs: DS.hasMany('group')
});

现在我们需要告诉Ember Data,孩子们将进入父母的嵌入式。为此,我们将DS.EmbeddedRecordsMixin混合到序列化程序中,并指定attrs哈希,如下所示:

// serializers/group.js
export default DS.RESTSerializer(DS.EmbeddedRecordsMixin, {
  attrs: {
    childs: { embedded: 'always' }
  }

然而,还有一个问题。默认情况下,Ember Data会期望childs属性包含一系列的孩子。相反,您的数据包含childs包含数组的group属性。我们需要解决这个问题,我们将通过覆盖normalize

来解决这个问题
  normalize(type, hash, prop) {
    hash.childs= hash.childs.group;
    return this._super(type, hash, prop);
  }
});

还有其他问题需要担心,包括您是否希望Ember Data序列化嵌入的子级(写回服务器时),但上述内容应足以让您入门。

顺便说一下,我注意到你有两个id为0的不同组。这将使Ember Data大为混乱。尝试拥有唯一的ID。如果无法做到这一点,您可以考虑使用其他串行器逻辑来合成ID。