与嵌入式记录和烬数据工作



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

http://emberjs.jsbin.com/faledu/6/edit?html、js、输出

当前,我得到以下错误:

处理路由时出错:index Assertion Failed: Ember Data期望一个数字或字符串来表示objects关系中的记录,而不是找到一个对象。如果这是一个多态关系,请指定type键。如果这是一个嵌入式关系,请在序列化器的attrs对象中包含DS.EmbeddedRecordsMixin并指定objects属性。错误:Assertion Failed: Ember Data期望一个数字或字符串来表示objects关系中的记录,而不是找到一个对象。如果这是一个多态关系,请指定一个type键。如果这是一个嵌入关系,请在序列化器的attrs对象中包含DS.EmbeddedRecordsMixin并指定objects属性。

我用的是DS。EmbeddedRecordsMixin在我的序列化器,但它似乎不工作。我如何使用JSON与烬数据?

您可以添加一个自定义的array转换供ember-data使用,并且通过消除对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 [];
    }
  }
});

但是,我要说的是,当涉及到结构时,您应该真正避免与ember-data作斗争。我曾尝试强行使用边缘情况,结果做了很多不必要的工作。如果你不能修改你的API使其更"JSON API"友好,我会考虑寻找其他替代方法来替代ember-data,或者考虑使用纯AJAX来处理类似于Discourse方法的事情。在一天结束时,我只是试图确保您的API工作在侧加载风格或使用async方法的两个单独的请求。你的生活会轻松很多。

"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

最新更新