我有以下型号:
App.Publication = DS.Model.extend({
title: DS.attr('string'),
bodytext: DS.attr('string'),
author: DS.belongsTo('author')
});
App.Author = DS.Model.extend({
name: DS.attr('string')
});
以下json数据:
{
"publications": [
{
id: '1',
title: 'first title',
bodytext: 'first body',
author_id: 100
},
{
id: '2',
title: 'second title',
bodytext: 'second post',
author_id: 200
}
];
}
在Ember Data RC12中,这有效(您可以在json中指定author_id或作者,并且出版物将始终链接正确的作者)。
在Ember Data 1.0.0中,这不再适用;作者总是空的。
在一些文档中我发现 - 因为我在json数据中使用“author_id”(而不仅仅是作者) - 我需要在模型中指定键;因此:
author: DS.belongsTo('author', { key: 'author_id' })
然而,这不起作用;该出版物中的作者仍为空。
我现在看到的唯一解决方案是实现自定义序列化程序并将author_id覆盖为author(通过normailzeId);我无法改变我的后端数据结构...因此:
App.MySerializer = DS.RESTSerializer.extend({
//Custom serializer used for all models
normalizeId: function (hash) {
hash.author = hash.author_id;
delete hash.author_id;
return hash;
}
});
以上是正确的方法吗?
答案 0 :(得分:7)
默认情况下,Ember Data 1.0不再执行任何有效负载标准化。 key
的{{1}}配置也已删除,因此您必须实现自定义序列化程序。
DS.belongsTo
是一个内部序列化函数,用于将主键转换为始终在normalizeId
处可用。你不应该覆盖它。
相反,您可以覆盖为此目的提供的id
方法。
您可以使用以下内容:
keyForRelationship
注意:我还将序列化程序重命名为App.ApplicationSerializer = DS.RESTSerializer.extend({
keyForRelationship: function(rel, kind) {
if (kind === 'belongsTo') {
var underscored = rel.underscore();
return underscored + "_id";
} else {
var singular = rel.singularize();
var underscored = singular.underscore();
return underscored + "_ids";
}
}
});
,以便它可以用作应用程序的默认序列化程序。
最后,如果您还没有找到它,请在此处查看转换说明:https://github.com/emberjs/data/blob/master/TRANSITION.md
如果您在最初的1.0.0.beta.1发布后不久阅读了转换文档,我建议您再次查看,因为已经添加了许多内容,特别是有关序列化的内容。
答案 1 :(得分:1)
来自Ember 1.0.0 Transition Guide:
下划线密钥,_id
和_ids
在0.13中,REST适配器自动为您传入传入密钥。它还期望在name_id
和hasMany
关系下列出属于关系,以列在name_ids
下。
如果你的应用程序返回带有下划线属性的json以及关联的_id
或_ids
,你可以扩展ActiveModelSerializer
,所有这些都可以开箱即用。
App.ApplicationSerializer = DS.ActiveModelSerializer.extend({});
注意:不要将DS.ActiveModelSerializer与作为Rails API项目一部分的ActiveModelSerializer gem混淆。传统的Rails API项目具有产生强调的输出,DS.ActiveModelSerializer将执行预期的规范化行为,例如JSON中的camelizing属性键。