首先,我将使用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
这实际上是有效的,但显然是旧的,因为参数已经改变了。在我看来,这是一个hack。http://mozmonkey.com/2013/12/serializing-embedded-relationships-ember-data-beta/
有这个项目,但没有文档或如何使它工作的例子。https://github.com/pixelhandler/ember-data-extensions
总之,我很困惑。
正确的方法是使用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' })