2016-04-24 60 views
0

我有一个简单的API返回通道,并且每个通道包含一些故事。该API返回一个信道的结构如下:EmberJS RESTSerializer嵌入hasMay关系

{ 
    "id": 1, 
    "name": "The Awesome Channel", 
    "stories": [ 
     { 
      "icon": null, 
      "id": 3, 
      "pub_date": "2015-08-08T17:32:00.000Z", 
      "title": "First Cool Story" 
     }, 
     { 
      "icon": null, 
      "id": 4, 
      "pub_date": "2015-10-20T12:24:00.000Z", 
      "title": "Another Cool Story" 
     } 
    ] 
} 

我已经以下两个模型中所定义,channel.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    bgurl: DS.attr('string'), 
    stories: DS.hasMany('story') 
}); 

story.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    channelId: DS.attr('number'), 
    title: DS.attr('string'), 
    pubDate: DS.attr('string'), 
    icon: DS.attr('string'), 
}); 

我也有这个RESTSerializer到反序列化一个频道:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
    normalizeArrayResponse(store, primaryModelClass, hash, id, requestType) { 
     var newHash = { 
      channels: hash 
     }; 
     return this._super(store, primaryModelClass, newHash, id, requestType); 
    }, 

    normalizeSingleResponse(store, primaryModelClass, hash, id, requestType) { 
     // Convert embedded data into a lost of story ids 
     var stories = hash.stories.map(function(story) { 
      return story.id; 
     }); 
     delete hash.stories; 
     hash.stories = stories; 
     var newHash = { 
      channel: hash, 
     }; 
     return this._super(store, primaryModelClass, newHash, id, requestType); 
    } 
}); 

上面的代码工作正常,但它会向通道中的每个故事的服务器发出一个新请求,但由于数据已包含在响应中,因此不需要这些额外的请求。如果我将故事数据原样保留,那么规范化数据将失败。

有没有方法可以指示相关模型的数据嵌入到响应中?

回答

1

您是否试图将故事声明为嵌入到频道序列化器中?

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    stories: { embedded: 'always' } 
    }, 

    normalizeArrayResponse(store, primaryModelClass, hash, id, requestType) { 

    ... 
}); 
+0

应该是别的东西......我赶紧想你的样品和嵌入策略非常...这个说法当模型键(在这里“通道”的阵列或“频道” SingleRecord)是空的失败 – bmeurant

+0

我以前见过,但是我总是错过了'DS.EmbeddedRecordsMixin'部分,直到我读到您的回复。 – tantalum