Ember.js Rest Adapter:无根映射 JSON(.NET Web API)
Posted
技术标签:
【中文标题】Ember.js Rest Adapter:无根映射 JSON(.NET Web API)【英文标题】:Ember.js Rest Adapter: mapping JSON with no root (.NET Web API) 【发布时间】:2013-03-28 04:37:50 【问题描述】:我有一个使用 .NET Web API 编写的现有服务。
例如,此服务以以下格式返回 JSON:
[
"id": 1, "name": "John" ,
"id": 2, "name": "Jane"
]
但是,根据 Ember.js Rest Adapter documentation,Ember 期望 JSON 采用以下格式:
"persons": [
"id": 1, "name": "John" ,
"id": 2, "name": "Jane"
]
因此,Ember 返回以下错误: 您的服务器返回了一个带有密钥 0 的哈希,但您没有它的映射
我绝不打算更改我的服务 API 及其返回数据的方式。
是否可以让 Ember.js(最新版本)处理我的服务返回的现有数据?如果是这样,我该如何实现?
【问题讨论】:
【参考方案1】:Ember 在这个意义上非常灵活,能够扩展适配器和序列化程序,以便将您的应用与任何后端 API 集成。
您应该获得 WebAPIAdapter,它是 Ember.js Template for Web API 的一部分。
此外,您可能想看看我作为示例编写的this project,它基于相同的模板(我自己做了一些修改)。它仍在开发中,还没有包含所有最佳实践(目前),但我认为这是一个有效的示例。
您还应该看看这个repo / library(您也可以安装它via NuGet),它允许您将Handlebars 模板直接预编译到Ember.TEMPLATES
集合中。
【讨论】:
谢谢!在您的 Ember-Contact-Management-WebAPI 中,您是否正在对数据进行任何特殊的调整或序列化以使用 Ember?我注意到您的 ContactController 返回 IEnumerableplurals
。 This 语法对修订版 4 有效,但我们目前处于修订版 12。老实说,我不知道这部分 API 是否已更改
我知道这很奇怪,但是 .NET 中的大多数 API 不会将控制器复数,这就是为什么 WebAPIAdapter#pluralize
只是按照定义的方式返回模型的名称,只是小写。您可以从 WebAPIAdapter 中删除此方法(回退到 RESTAdapter#pluralize)或编辑它以返回 + 's'
...【参考方案2】:
在 web api 中只返回 new object
var persons = _personbService.GetPeople;
return new persons ;
这会将您的对象包装在同名对象中。如果您需要调用该对象的其他东西,只需执行
new SomeOtherName = persons;
【讨论】:
这仅在您从我所知道的范围内返回单个对象时才有效。如果您有关系(例如 BlogPost/Comments),那么 cmets 会在 BlogPost 内部返回,这似乎违反了默认设置。 ember web api 包会处理它npmjs.com/package/ember-web-api【参考方案3】:我在 ember 中遇到了这个问题,发现对我来说最好的解决方案是构建一个新的序列化程序并覆盖 normalizePayload 方法。代码如下:
export default DS.RESTSerializer.extend(
normalizePayload: function(payload)
var root = "posts";
var output = ;
output[root] = payload;
return output;
);
这包装了初始响应并为其添加了根,希望对您有所帮助!
【讨论】:
以上是关于Ember.js Rest Adapter:无根映射 JSON(.NET Web API)的主要内容,如果未能解决你的问题,请参考以下文章
用于 Restful 后端的 Ember.js 或 Backbone.js [关闭]