2015-10-12 181 views
0

將我的樹結構加載到Ember中時,我遇到了一些特殊的問題。Ember數據嵌套資源樹結構

我的車型有:

book.js 
    - parts: DS.hasMany('part', {inverse: 'book', async: true}) 

part.js 
    - subparts: DS.hasMany('part', {inverse: 'parent_part', async: true}), 

用下面的API響應:

GET /api/books: 
{ 
    books: [ 
    {id: 1, links: {parts: "/api/books/1/parts"}}, 
    ... 
    ] 
} 

GET /api/books/1/parts: 
{ 
    parts: [ 
    { 
    id: 1, 
    subparts: [10, 11] 
    }, 
    { 
    id: 2, 
    subparts: [] 
    } 
    ] 
} 

的問題是在零件的樹性質:書中只有直接後裔id爲1和2,但是這些都有自己的子部分。 原樣結構工程但會導致在/books/1/parts結果中未包含的每個零件的多個子查詢。我想避免這些查詢,這不僅僅是因爲性能的原因,而且還因爲我需要額外的查詢參數,這些參數在這一步會丟失......我知道coalesceFindRequests,但它引入了新的問題。

爲了更正此問題,Ember Data認爲/books/1/parts響應中包含的每個part都應直接添加到book:parts屬性中。我怎樣才能同時加載零件樹的所有記錄?

我試着重命名字段,但Ember Data根據型號名稱而不是字段名稱分配記錄。

我擔心在這裏需要重寫一些有創意的適配器。任何想法讚賞。後端完全在我的控制之下,所以我也可以爲此改變事情。

+0

您使用的是RESTAdapter(Ember Data 1.x中的默認值)還是JSONAPIAdapter(Ember Data 2.x中的默認值)? – GJK

+0

@GJK我在Ember 1.13.7上使用RESTAdapter。我應該試試JSONAPIAdapter嗎? – graup

+0

沒有RESTAdapter應該沒問題,它們只是略有不同的功能,所以我想在我回答你的問題之前知道。你想要做的是一個叫做「sideloading」的過程。在工作中我還有一件事要做,但當我完成這件事時,我會爲你寫一個答案。 – GJK

回答

0

您需要使用一個稱爲sideloading的過程,其中應該按照您的預期工作(我在過去使用sideloading數據時遇到了問題)。如this issue中所述,您希望將零件分成兩個單獨的陣列。

{ 
    // These are the direct children 
    "parts": [{...}, {...}], 
    // These are the extra records 
    "_parts": [{...}, {...}] 
}