Ember数据和映射JSON对象

时间:2013-03-11 21:10:11

标签: json ember.js ember-data

我已经真正搜索过了,我还没有找到一个使用序列化程序从不同格式的JSON响应中获取对象的好例子。我在http://flask.pocoo.org/docs/security/#json-security概述了不更改JSON响应格式的原因。

我对javascript还不是很好,所以我很难理解serialize_json.js中的钩子,或者我应该使用map(我只是不知道)。所以这是我对许多对象的JSON响应的一个例子:

{
  "total_pages": 1, 
  "objects": [
     {
      "is_completed": true, 
      "id": 1, 
      "title": "I need to eat"
    }, 
    {
      "is_completed": false, 
      "id": 2, 
      "title": "Hey does this work"
    }, 
    {
      "is_completed": false, 
      "id": 3, 
      "title": "Go to sleep"
    }, 
  ], 
  "num_results": 3, 
  "page": 1
}

当ember-data尝试使用它时,我收到以下错误:

DEBUG: -------------------------------
DEBUG: Ember.VERSION : 1.0.0-rc.1
DEBUG: Handlebars.VERSION : 1.0.0-rc.3
DEBUG: jQuery.VERSION : 1.9.1
DEBUG: -------------------------------
Uncaught Error: assertion failed: Your server returned a hash with the key total_pages but you have no mapping for it 

当您查看我的数据存储代码时,这完全可以做到:

Todos.Store = DS.Store.extend({
    revision: 12,
    adapter: DS.RESTAdapter.create({
        mappings: {objects: "Todos.Todo"},
        namespace: 'api'
    })
});

我的问题是如何处理total_pagesnum_resultspage?通过交易,我的意思是忽略,所以我可以只映射objects数组。

3 个答案:

答案 0 :(得分:3)

您在JSON结果中返回的所有根属性都将映射到Ember Data中的DS.Model。您不应该返回未建模的属性,也不应该对它们进行建模。

如果你想摆脱错误,你应该为你不使用的属性制作一个空模型。

了解更多here

为什么要退回不想使用的属性?还是不受你的控制?

答案 1 :(得分:1)

对于事情是如何完成的,Ember非常自以为是。 Ember数据也不例外。 Ember团队致力于达到它认为最好的某些标准,在我看来,这是一件好事。

查看this post关于ember的去向。 TL; DR因为有很多不同的api调用实现,他们正在努力支持JSON API

根据我的理解,没有简单的方法来做你所要求的。您最好的选择是编写自己的自定义适配器并进行序列化。这不应该太难做,而且以前做过。我建议你看一下用于Python的Django Tastypie的Tastypie adapter

答案 2 :(得分:1)

实现此目的的方法是使用自定义序列化程序。如果以这种格式从服务器返回所有数据,您只需创建ApplicationSerializer,如下所示:

DS.RESTSerilizer.extend({
  normalizePayload: function(type, payload) {
     delete payload.total_pages;
     delete payload.num_results;
     delete payload.page;
     return payload;
  }
});

这应该允许Ember Data无缝地使用您的API。