获取 Ember 处理对象数组的数据

Get Ember Data working with array of objects

我有一个简单的 Ember 数据应用程序来列出和显示各种对象。

我的/servers.jsonAPI(例如)return这种格式:

[
   {
      "hosted_domain" : "example.com",
      "status" : 1,
      "name" : "srv0443",
      "id" : 443
   },
   {
      "id" : 392,
      "status" : 1,
      "name" : "srv0392",
      "hosted_domain" : "example.com"
   },
   {
      "hosted_domain" : "example.com",
      "id" : 419,
      "name" : "srv0419",
      "status" : 1
   }
]

但是我得到以下错误:

Assertion Failed: The response from a findAll must be an Array, not undefined

Ember 数据需要这种格式:

{
   "servers" : [
      {
         "name" : "srv0443",
         "status" : 1,
         "id" : 443,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0392",
         "id" : 392,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0419",
         "hosted_domain" : "example.com",
         "id" : 419
      },
  ]
}

我知道我可以用 RESTSerializerextractArray 覆盖负载。

它是通过 payload = { servers: payload } 来工作的,但是如何让它以通用的方式工作呢?

我怎样才能捕捉到模型类型所需的键?

更一般地说,按照惯例,好的 REST 格式是什么?

谢谢。

Ember 数据通过让数据遵循特定约定({servers: payload})来工作。所以数据要么需要符合,要么你必须像你提到的那样扩展序列化程序(或其他一些自定义,比如覆盖模型的 findAll() 方法)。如果你想使用 Ember 数据,它周围没有任何东西。当然,您不必使用 Ember 数据。这是一篇关于不使用它的好文章:http://eviltrout.com/2013/03/23/ember-without-data.html

要自定义序列化程序,您可以像这样扩展它:
App.ServerSerializer = DS.RESTSerializer.extend({ extractArray: function(store, type, payload) { this._super(store, type, {servers: payload}); }, });

ember 在从服务器获得响应后自动调用提取数组。这将放入 ember 数据期望的格式,然后将其传递以继续照常处理。但是您必须为每种类型的模型执行此操作。如果您覆盖 App.ApplicationSerializer 而不是您可以使用类型参数来确定修改后的有效负载中应该包含哪个密钥,因此它适用于任何模型,但我现在无法检查它。

最终在 RESTSerializer 上使用 primaryType.typeKeyember-inflector 工具找到了解决方案:

App.ApplicationSerializer = DS.RESTSerializer.extend
  extractArray: (store, primaryType, payload) ->
    # Payload reload with { type.pluralize: hash }
    payloadKey = Ember.Inflector.inflector.pluralize primaryType.typeKey
    payloadReloaded = []
    payloadReloaded[payloadKey] = payload

    @_super store, primaryType, payloadReloaded

简而言之:

  • 获取类型键(例如服务器)
  • 将其复数化(例如 servers
  • 将其添加为负载主密钥(例如 { servers: payload }

就是这样!

如果您有更好的建议,请随时评论此解决方案。