Javascript 使用嵌入式记录和余烬数据

Javascript 使用嵌入式记录和余烬数据,javascript,json,ember.js,ember-data,Javascript,Json,Ember.js,Ember Data,我正在处理Ember和Ember数据,从服务器返回的JSON包含一个嵌入式对象数组。我需要知道我做错了什么。我有一个JSBin,代码如下: 目前,我收到以下错误: 处理路由时出错:索引断言失败:余烬数据需要一个数字或字符串来表示对象关系中的记录,但它找到了一个对象。如果这是多态关系,请指定类型键。如果这是嵌入关系,请包括DS.EmbeddedRecordsMixin,并在序列化程序的attrs对象中指定对象属性。错误:断言失败:余烬数据需要一个数字或字符串来表示对象关系中的记录,但它找到了一个

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

目前,我收到以下错误:

处理路由时出错:索引断言失败:余烬数据需要一个数字或字符串来表示
对象
关系中的记录,但它找到了一个对象。如果这是多态关系,请指定
类型
键。如果这是嵌入关系,请包括
DS.EmbeddedRecordsMixin
,并在序列化程序的attrs对象中指定
对象
属性。错误:断言失败:余烬数据需要一个数字或字符串来表示
对象
关系中的记录,但它找到了一个对象。如果这是多态关系,请指定
类型
键。如果这是嵌入关系,请包括
DS.EmbeddedRecordsMixin
,并在序列化程序的attrs对象中指定
对象
属性


我正在序列化程序中使用DS.EmbeddedRecordsMixin,但它似乎不起作用。如何将该JSON用于Ember数据?

您可以为Ember数据添加自定义的
数组
转换以供使用,并通过消除对
EmbeddedRecordsMixin
等的需要,大大简化您的代码

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

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以获得更多的“JSONAPI”的友好性,我会考虑查看其他数据的备选方案,或者只考虑使用简单的Ajax来处理类似于语篇的方法。最后,我将尝试确保您的API以侧加载方式工作,或者使用
async
方法执行两个单独的请求。你的生活会轻松得多

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

这是一篇旧的博文,但如果您的用例需要在ember data happy path之外运行,那么主要概念仍然适用-

您可以为ember data添加一个自定义的
数组
转换以供使用,并通过消除对
EmbeddedRecordsMixin
等的需要,大大简化您的代码

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

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以获得更多的“JSONAPI”的友好性,我会考虑查看其他数据的备选方案,或者只考虑使用简单的Ajax来处理类似于语篇的方法。最后,我将尝试确保您的API以侧加载方式工作,或者使用
async
方法执行两个单独的请求。你的生活会轻松得多

"design": {
  "id": "1",
  "name": "test1",
  "description": "testing",
  "objects": [1, 2]
},
"objects": [
  {
    "id": 1,
    "name": "foo"
  },
  {
    "id": 2,
    "name": "bar"
  }
]
这是一篇老博文,但如果您的用例需要在ember data happy path之外运行,那么主要概念仍然适用-