我使用的是最新版本的EmberJS和Ember Data。 我有下一个JSON数据:
[{
"id": 6,
"name": "First object",
"vol": 40,
"description": "bla bla bla",
"category": "first"
}, {
"id": 7,
"name": "Second object",
"vol": 17,
"description": "Some description",
"category": "second"
}]
下一个模型:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
vol: DS.attr('number'),
description: DS.attr('string'),
category: DS.attr('string')
});
我不明白如何使Ember数据有效。我怀疑ember数据需要下面的内容:
[{
model-name {
"id": 6,
"name": "First object",
"vol": 40,
"description": "bla bla bla",
"category": "first"
}
}, {
model-name {
"id": 7,
"name": "Second object",
"vol": 17,
"description": "Some description",
"category": "second"
}
}]
在控制台中我有一堆警告:
WARNING: Encountered "0" in payload, but no model was found for model
name "0" (resolved model name using emdber-drink-
it@serializer:application:.modelNameFromPayloadKey("0"))
WARNING: Encountered "1" in payload, but no model was found for model
name "1" (resolved model name using emdber-drink-
it@serializer:application:.modelNameFromPayloadKey("1"))
超过一百个类似记录(即服务器根据请求返回的记录数)。 商店里没有数据。
如何在不更改从服务器收到的JSON的情况下解决此问题?
答案 0 :(得分:5)
来自http://emberjs.com/api/data/classes/DS.JSONSerializer.html
在Ember Data中,序列化器用于序列化和反序列化 记录何时转入和转出外部来源。 此过程涉及规范化属性名称,进行转换 属性值和序列化关系。
目前有4种类型的序列化器:
您拥有的JSON数据是普通的json。
JSONSerializer对于可能没有的更简单或传统后端非常有用 支持http://jsonapi.org/规范
所以你需要 JSONSerializer 这是使用普通json数据的最简单的解决方案。
使用ember-cli非常容易创建一个新的序列化程序,例如模型book
:
ember generate serializer book
会产生这样的东西:
version: 1.13.8
installing serializer
create app/serializers/book.js
installing serializer-test
create tests/unit/serializers/book-test.js
上一个命令将创建一个 RESTSerializer 类型的序列化器。 (如果你不使用ember -cli只是手边创建这个文件)
// app/serializers/book.js
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
});
然后按RESTSerializer
更改JSONSerializer
:
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
primaryKey: '_id', // useful for mongodb-like data
});
我希望你像我一样喜欢学习余烬。
答案 1 :(得分:2)
您应该能够添加自定义序列化程序,以便为JSON数据添加根密钥。我没有测试过这个,但你可以尝试类似的东西:
(以“书”模型为例)
// app/serializers/book.js
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
extractArray: function(store, type, payload) {
var newPayload = {};
newPayload[type.modelName] = payload;
return this._super(store, type, newPayload);
}
});
如果这是整个API的问题,那么您可能需要为整个应用程序创建一个自定义序列化程序,并使用传入的type
参数来构建根密钥。
另外作为旁注,如果我无法控制API,我可能不会使用Ember Data。除非它遵循像jsonapi.org这样严格的指导方针,否则你一定会遇到一些麻烦。
编辑 - 更改了上述建议的答案(使用'type'构建根密钥)。
答案 2 :(得分:0)
我采取了另一种方法并重载了#model; modelNameFromPayloadKey'方法
如果有效负载密钥的类型为整数,则它将映射到模型的名称。
// app/serializers/<model>.js
import DS from 'ember-data';
import normalizeModelName from "ember-data/-private/system/normalize-model-name";
import {singularize} from "ember-inflector";
export default DS.RESTSerializer.extend({
model: '<model>',
modelNameFromPayloadKey(key) {
// Check whether the key is of type integer
if (!isNaN(key)) {
return normalizeModelName(this.get('model'));
}
return singularize(normalizeModelName(key));
},
});