我有一个简单的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格式?
感谢。
答案 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.typeKey
和ember-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: payload }
就是这样!
如果您有更好的主张,请随时评论此解决方案。