获取Ember Data处理对象数组

时间:2015-03-20 15:23:36

标签: rest ember.js ember-data

我有一个简单的Ember Data应用程序列出并显示各种对象。

我的/servers.json API(例如)返回这种格式:

[
   {
      "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 Data期望这种格式:

{
   "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
      },
  ]
}

我知道我可以使用RESTSerializer的{​​{3}}覆盖有效负载。

这可以通过payload = { servers: payload }来实现,但是如何让它以通用的方式运作?

如何捕获模型类型所需的键?

按照惯例,按照惯例,什么是好的REST格式?

感谢。

2 个答案:

答案 0 :(得分:0)

Ember Data通过使数据遵循特定约定({servers:payload})来工作。因此,数据需要符合要求,或者您必须按照您的提及扩展序列化程序(或者像覆盖模型的findAll()方法那样进行其他一些自定义)。如果你想使用Ember Data,它周围也没有。当然,您不必使用Ember Data。这是一篇关于不使用它的好文章: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会自动调用Extract数组。这将输入格式化的ember数据,然后传递给它继续像往常一样处理。但是你必须为每种类型的模型做到这一点。如果您重写App.ApplicationSerializer,您可能可以使用类型参数来确定哪个键应该在修改的有效负载中,因此它适用于任何模型,但我现在无法检查它。

答案 1 :(得分:0)

最后在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

简而言之:

  • 获取类型密钥(例如服务器)
  • 将其多元化(例如服务器 s
  • 将其添加为有效负载主密钥(例如{ servers: payload }

就是这样!

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