Ember 模型未命名 JSON 变量

Ember model unnamed JSON variable

我正在尝试在 Ember 中使用以下 JSON 响应。

[
  {
    "url": "https://example.com",
    "files": {
      "config.json": {
        "name": "config.json"
      },
      "style.css": {
        "name": "style.css"
      }
    },
    "user": null
  },
  {
    "url": "https://newexample.com",
    "files": {
      "settings.json": {
        "name": "settings.json"
      },
      "index.html": {
        "name": "index.html"
      }
    },
    "user": null
  }
]

这是我的第一个模型 "snippet":

export default Model.extend({
  url: attr('string'),
  files: hasMany('file')
});

然后是我的 "file" 模型,我用它创建了一个 hasMany 关系:

export default Model.extend({
  name: attr()
});

index.js 路线:

export default Ember.Route.extend({
  model() {
    return this.store.findAll('snippet');
  }
});

我意识到这行不通,因为我没有在 "files" 中定义第一个变量。虽然我不知道该怎么做,因为这个变量取决于文件名。

如有任何帮助,我们将不胜感激。谢谢。

你需要用 embeded record mixin 实现 json serializer 看看这个 link https://guides.emberjs.com/v2.0.0/models/customizing-serializers/#toc_embeddedrecordmixin

比您需要实施 normalizefindAllresponse 检查此 link 以了解此类方法 http://emberjs.com/api/data/classes/DS.JSONSerializer.html

所以最后你想要的代码是 snippet.js 序列化器

export default DS.JSONSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    files: { embedded: 'always' }
  },

 normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {
  payload = {snippet: payload};
 // normalize your payload or json at here, it should be like as i explain below
payload.snippet
 return this.normalizeArrayResponse(...arguments);
  },
});

确保您的json采用这种格式

[
  {
    "url": "https://example.com",
    "files": [ 
      {
        "name": "config.json"
      },
   {
        "name": "style.css"
   }

     ],

]

阅读此文档以获得帮助。 http://thejsguy.com/2015/12/05/which-ember-data-serializer-should-i-use.html 基本上你需要根据你的需要使用序列化程序,而不是规范化来自 api.

的响应