将树形结构加载到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会认为part
响应中包含的每个/books/1/parts
都应直接添加到book:parts
属性中。我怎样才能同时加载零件树的所有记录?
我尝试重命名字段,但Ember Data根据型号名称而不是字段名称分配记录。
我担心这里需要一些创意适配器覆盖。任何想法都赞赏。后端完全在我的控制之下,所以我也可以改变目的。
答案 0 :(得分:0)
你需要使用一个名为sideloading的进程,应按预期工作(我过去曾遇到过侧载数据问题)。如this issue中所述,您希望将零件拆分为两个独立的阵列。
{
// These are the direct children
"parts": [{...}, {...}],
// These are the extra records
"_parts": [{...}, {...}]
}