嵌入式记录在最新的ember-data#1.0.0中

时间:2014-07-03 12:00:38

标签: ember.js ember-data

首先,我将使用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

总而言之,我很困惑。

1 个答案:

答案 0 :(得分:0)

正确的方法是使用serializerDS.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' })