2016-04-24 34 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