Ember数据1.0 beta如何映射嵌入数据

时间:2013-09-04 15:44:58

标签: javascript ember.js ember-data

似乎ember数据有很多变化到版本1.0 beta。所有版本都适用于版本0.13。现在我想更新到更高版本。在我的例子中,我们有一个嵌入式模型'user'

    App.Post = DS.Model.extend({
          subject: DS.attr('string'),
          created: DS.attr('number'),
          fcreated: function(){
              debugger;
              var d =  new Date(this.get('created'));
              return d.toLocaleDateString();
          }.property('created'),

          reporter: DS.belongsTo('user')
}

App.ApplicationAdapter = DS.RESTAdapter.extend({
    namespace: 'restws'
});

来自服务器的Json看起来像这样。

   {
    "posts": [
      {
       "id": "5226f2670364e70ae7d77266",
       "subject": "Text",
       "created": 1325410935048,
       "reporter": {
               "id": "5226f2660364e70ae7d771e2",
               "firstName": "Doris",
               "lastName": "Baumertr"
       }
  }

我得到以下错误代码'Uncaught TypeError:无法调用方法'toString'of undefined'。在ember源代码中,我看到,在ember-data.js第2236行,函数抛出错误'buildRecord:function(type,id,data)..'调试后我看到属性类型是未定义的id设置为正确的id和数据是不确定的?

错误是什么?我如何映射嵌入数据?

2 个答案:

答案 0 :(得分:2)

这实际上是您需要实现的确切的extractSingle方法

App.PostSerializer = DS.RESTSerializer.extend({
    extractSingle: function(store, type, payload, id, requestType) {
      if(typeof payload.post.reporter !== "undefined") {
        var reporter_id = payload.post.reporter.id;
        payload.users = [payload.post.reporter];
        payload.post.reporter = reporter_id;
      }
      return this._super.apply(this, arguments);
    }
});

这是一个jsbin http://jsbin.com/EKItexU/1/edit?html,js,output

注意,我必须在RESTAdapter中重新定义ajax方法以模拟返回JSON的服务器。

此外,如果您在JSON中加载用户,那么您必须更新此方法,以便它不会覆盖有效负载中的侧载用户(payload.users属性)

答案 1 :(得分:1)

对嵌入式记录的支持已经消失(现在)

您可以通过实施extractSingle并重新组织JSON有效负载来自行处理嵌入式记录。

请阅读此处了解有关过渡的更多信息:https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records

希望它有所帮助。