【问题标题】:Get Ember Data working with array of objects使用对象数组获取 Ember Data
【发布时间】:2015-03-23 19:29:42
【问题描述】:

我有一个简单的 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
      },
  ]
}

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

通过payload = { servers: payload } 可以工作,但如何以通用方式工作?

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

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

谢谢。

【问题讨论】:

    标签: rest ember.js ember-data


    【解决方案1】:

    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 收到服务器响应后会自动调用提取数组。这将以 ember 数据期望的格式输入,然后将其传递给照常继续处理。但是您必须对每种类型的模型都这样做。如果您改写 App.ApplicationSerializer,您也许可以使用 type 参数来确定修改后的有效负载中应该包含哪个键,因此它适用于任何模型,但我现在无法检查。

    【讨论】:

    • 感谢您的帮助和链接。但我的问题正是关于如何覆盖序列化程序以使其适应返回的数据。
    • 哦,好吧,我以为你试图避免这样做。我编辑了答案以包括如何做到这一点。
    • 是的,我知道这个解决方案,但特定于服务器模型。我有几十个模型和控制器,覆盖每一个都会很痛苦。我正在通过获取需要的密钥(在本例中为servers)来寻找通用方法。你明白了吗?谢谢你的帮助。
    【解决方案2】:

    终于在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 }

    就是这样!

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

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多