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