2014-07-03 38 views
2

首先,我将使用烬-CLI的发展,我在嵌入式格式服务器获取JSON:嵌入式记录在最新的余烬数据#1.0.0

单个对象

{ 
    "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); 

    }, 
)} 

我已经遍布各地搜索,可以看到所有这些不同的方式嵌入记录在余烬。

官方文档告诉我们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

正确的做法是使用serializerDS.EmbeddedRecordsMixin

通过在模型中指定序列化程序选项,您真的可以解决问题分离问题。

所以,说,让我们回到邪恶。

您可以简单地将DS.EmbeddedRecordsMixin复制到您的应用程序中,并将其检查方式修改为检查模型类型上的关系元数据。然后,您可以使用您的自定义mixin扩展您的默认ApplicationSerializer,以便您不必为所有模型指定序列化程序。

您需要修改以下功能,从这个:

attrsOption: function(attr) { 
    var attrs = this.get('attrs'); 
    return attrs && (attrs[camelize(attr)] || attrs[attr]); 
    } 

要像这样(注意额外PARAM):

attrsOption: function(attr, type) { 
    var meta = type.metaForProperty(attr) || type.metaForProperty(camelize(attr)); 
    return meta && meta.options; 
    } 

您还需要修改所有的调用attrsOption将模型类型向下传递,但是您将拥有自己的嵌入式记录混合模式,以从模型类型中获取其选项。

然后指定你的模型中的关系时,您可以使用嵌入式记录选项如下:

address: DS.belongsTo('address', { embedded: 'always' })