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



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

总之,我很困惑。

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

最新更新