使用Embedded Records和Ember Data

时间:2015-06-03 14:01:06

标签: javascript json ember.js ember-data

我正在使用Ember和Ember Data,我从服务器返回的JSON包含一个嵌入式对象数组。我需要知道我做错了什么。我有一个JSBin,代码如下:

http://emberjs.jsbin.com/faledu/6/edit?html,js,output

目前,我收到以下错误:

  

处理路径时出错:索引断言失败:Ember数据需要一个数字或字符串来表示objects关系中的记录,而不是找到一个对象。如果这是多态关系,请指定type密钥。如果这是嵌入式关系,请包含DS.EmbeddedRecordsMixin并在序列化程序的attrs对象中指定objects属性。错误:断言失败:Ember数据需要一个数字或字符串来表示objects关系中的记录,而不是找到一个对象。如果这是多态关系,请指定type密钥。如果这是嵌入式关系,请包含DS.EmbeddedRecordsMixin并在序列化程序的attrs对象中指定objects属性。

我在我的序列化程序中使用DS.EmbeddedRecordsMixin,但它似乎不起作用。如何将该JSON与Ember Data一起使用?

1 个答案:

答案 0 :(得分:0)

您可以为要使用的ember-data添加自定义array转换,并通过消除对EmbeddedRecordsMixin等的需求来大大简化您的代码。

http://emberjs.jsbin.com/warebi/1/edit

以下是我过去经常使用的数组转换:

App.ArrayTransform = DS.Transform.extend({
  deserialize: function(serialized) {
    return (Ember.typeOf(serialized) === 'array') ? serialized : [];
  },

  serialize: function(deserialized) {
    var type = Ember.typeOf(deserialized);
    if (type === 'array') {
      return deserialized;
    } else if (type === 'string') {
      return deserialized.split(',').map(function(item) {
        return item.trim();
      });
    } else {
      return [];
    }
  }
});

但是,我会说你应该真正避免在结构方面与格斗数据作斗争。我试图强迫边缘情况,最终做了比需要更多的工作。如果您无法修改您的API,那就更多地使用JSON API'友好,我考虑考虑其他替代ember数据或考虑使用普通的AJAX来处理类似于Discourse方法的事情。在一天结束时,我只是尝试使用async方法确保您的API在侧载样式或两个单独的请求中工作。你的生活会更容易。

"design": {
  "id": "1",
  "name": "test1",
  "description": "testing",
  "objects": [1, 2]
},
"objects": [
  {
    "id": 1,
    "name": "foo"
  },
  {
    "id": 2,
    "name": "bar"
  }
]

这是一篇旧博客文章,但如果您的用例需要在ember-data开心路径之外运行,那么主要概念仍然适用 - http://eviltrout.com/2013/03/23/ember-without-data.html