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);
}
});
上面的代碼工作正常,但它會向通道中的每個故事的服務器發出一個新請求,但由於數據已包含在響應中,因此不需要這些額外的請求。如果我將故事數據原樣保留,那麼規範化數據將失敗。
有沒有方法可以指示相關模型的數據嵌入到響應中?
應該是別的東西......我趕緊想你的樣品和嵌入策略非常...這個說法當模型鍵(在這裏「通道」的陣列或「頻道」 SingleRecord)是空的失敗 – bmeurant
我以前見過,但是我總是錯過了'DS.EmbeddedRecordsMixin'部分,直到我讀到您的回覆。 – tantalum