首先,我将使用ember-cli进行开发,并以嵌入格式从服务器获取JSON:
单个对象
{
"id" : 1,
"name" : "Tom",
"surname" : "Smith",
"address" : {
"id" : 2,
"street" : "23",
"city" : "...",
...
}
}
阵列
[
{
"id" : 1,
"name" : "Tom",
"surname" : "Smith",
"address" : {
"id" : 2,
"street" : "23",
"city" : "...",
...
}
},
{
"id" : 2,
"name" : "Tom",
"surname" : "Smith",
"address" : {
"id" : 4,
"street" : "23",
"city" : "...",
...
}
},
...
]
我已经研究了如何使用RestAdapter中的以下内容将前缀附加到每个有效负载上。
export default DS.RESTSerializer.extend({
extract : function(store, type, payload, id, requestType) {
var typeKey = type.typeKey,
typeKeyPlural = typeKey.pluralize();
//Add name of model to payload as expected by ember data
var modelName = Array.isArray(payload) ? typeKeyPlural : typeKey;
var normalizedPayload = {};
normalizedPayload[modelName] = payload;
return this._super(store, type, normalizedPayload, id, requestType);
},
)}
我在各地搜索过,可以看到所有这些在ember中嵌入记录的不同方法。
官方文档告诉我们DS.EmbeddedRecordsMixin类。但这意味着我需要为每个模型创建一个DS.ActiveModelSerializer,我宁愿在模型中定义属性{embedded:“always”}。 http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html
这实际上有点工作,但显然是旧的,因为参数已经改变了。在我看来,这有点像黑客。 http://mozmonkey.com/2013/12/serializing-embedded-relationships-ember-data-beta/
有这个项目,但没有文档或如何使其工作的示例。 https://github.com/pixelhandler/ember-data-extensions
总而言之,我很困惑。
答案 0 :(得分:0)
正确的方法是使用serializer
和DS.EmbeddedRecordsMixin
。
您正在通过在模型中指定序列化程序选项来解决问题分离。
所以,那说,让我们深入了解邪恶。
您可以简单地将DS.EmbeddedRecordsMixin
复制到您的应用程序中,并修改其检查其选项的方式,而不是检查模型类型上的关系元数据。然后,您可以使用自定义mixin扩展您的默认ApplicationSerializer
,这样您就不必为所有模型指定序列化程序。
您需要修改以下功能:
attrsOption: function(attr) {
var attrs = this.get('attrs');
return attrs && (attrs[camelize(attr)] || attrs[attr]);
}
这样的事情(注意额外的参数):
attrsOption: function(attr, type) {
var meta = type.metaForProperty(attr) || type.metaForProperty(camelize(attr));
return meta && meta.options;
}
您还需要修改attrsOption
的所有调用方以向下传递模型类型,但您将拥有自己的嵌入式记录mixin,从模型类型中获取其选项。
然后在指定模型关系时,您可以使用嵌入式记录选项,如下所示:
address: DS.belongsTo('address', { embedded: 'always' })