2013-04-05 49 views
8

我有一個用.NET Web API編寫的現有服務。Ember.js Rest適配器:映射JSON與無根(.NET Web API)

作爲一個示例,該服務以下列格式返回JSON:

[ 
    { "id": 1, "name": "John" }, 
    { "id": 2, "name": "Jane" } 
] 

然而,如每Ember.js Rest Adapter documentation,灰燼會期望JSON以下列格式:

{ 
    "persons": [ 
    { "id": 1, "name": "John" }, 
    { "id": 2, "name": "Jane" } 
    ] 
} 

因此,Ember返回以下錯誤: 您的服務器返回的密鑰爲0的散列,但您沒有映射

絕不打算改變我的服務API以及它如何返回數據。

有可能得到Ember.js(最新版本)與我的服務返回的現有數據一起工作嗎?而且,如果是這樣,我該如何執行?

回答

5

Ember在這個意義上非常靈活,可以擴展適配器和序列化器,以便將應用程序與任何後端API集成。

您應該獲得WebAPIAdapter,它是Ember.js Template for Web API的一部分。

此外,你可能想看看this project我寫的一個例子,基於同樣的模板(我做了一些修改)。它仍在開發中,並沒有包含所有最佳實踐(但),但我認爲這是一個有效的例子。

您還應該看看這個repo/library(您也可以安裝它via NuGet),它允許您將Handlebars模板直接預編譯到Ember.TEMPLATES集合中。

在Web API
+0

謝謝!在你的Ember-Contact-Management-WebAPI中,你是否正在做任何特殊的適配或序列化數據來與Ember一起工作?我注意到您的ContactController會返回IEnumerable 或ContactDto for gets。這幾乎是我的Web API控制器公開的內容,但是,在我的結尾,格式不正確。 – 2013-04-05 17:36:38

+1

檢查[此目錄](https://github.com/MilkyWayJoe/Ember-Contact-Management-WebAPI/tree/master/Ember-Contact-Management-WebAPI/Scripts/app),你會看到Web API Adapter和WebAPISerializer,它處理與Ember-Data的JSON負載集成。這些類正在擴展內置的RESTAdapter和RESTSerializer。 – MilkyWayJoe 2013-04-05 17:43:42

+0

這正是我需要的。但是,由於某種原因,使用DS.WebAPIAdapter,Ember現在將我的REST服務url作爲單數名詞命中。例如,在使用RestAdapter之前,它會打到http:// localhost/api/things。現在它擊中http:// localhost/api/thing。有任何想法嗎? – 2013-04-05 18:04:47

0

只返回新{}對象

var persons = _personbService.GetPeople; 
     return new { persons }; 

這將包裝你的對象在同一名稱的對象。如果您需要調用對象別的東西只是做

new { SomeOtherName = persons; } 
+0

只有當你從我能說的內容中返回一個單獨的對象時,這纔有效。如果你有關係(前BlogPost /評論),那麼評論將返回到BlogPost裏面,這似乎違反了默認設置。燼Web api包照顧它https://www.npmjs.com/package/ember-web-api – 2016-01-11 06:32:02

0

我是有在灰燼這個問題,並找到了最好的解決辦法,我是要建立一個新的串行和覆蓋normalizePayload方法。代碼如下:

export default DS.RESTSerializer.extend({ 
normalizePayload: function(payload) { 
var root = "posts"; 
var output = {}; 
output[root] = payload; 
return output; 

} });

這包裝的初始響應,並添加到它的根,希望它有幫助!