想象一下,我们有一个应用程序,允许用户收集卡并制作其卡组。
另外,假设我们在路由器中:
this.route('cards');
this.route('decks', function() {
this.route('deck', {path: ':deck_name'});
});
和两个API端点:
GET /cards
-查询用户控制的所有卡GET /decks/:deck_name/cards
—用用户控制的特定deck_name
查询卡组中的所有卡牌我们有一个card
模型,并希望根据当前路由(向我们应用/cards
路由的第一个端点,向{{1} }路线)。
/decks/:deck_name
模型编写适配器以根据路由查询正确的端点? 换句话说,如何使用一个 Ember模型(用于卡)并将DS适配器指向不同的端点(例如,通过更改适配器的card
)取决于Ember Web应用程序中的当前路线?
我们使用Ember v2.18。
答案 0 :(得分:0)
根据评论中的约定,我们假设您的API实现了JSON API specification。
如果我说对了,您有一个decks
模型,该模型与cards
模型具有一对多的关系。您的API为decks
记录返回的resource object应该包含该关系的relationships object。这可以提供related resource link(允许提取相关记录),也可以提供resource identifiers至resource linkage的列表。
实现两个目标的资源对象如下:
{
"type": "decks",
"id": "1",
"relationships": {
"cards": {
"links": {
// related resource link
// specification is agnostic about how this URL may look like
"related": "https://examples.com/api/decks/1/cards"
},
// resource linkage
"data": [
{ "type": "cards", "id": "1" },
{ "type": "cards", "id": "2" }
]
}
}
}
如果您的API包含此信息,则可以使用该关系获取相关记录。灰烬数据将使用相关的资源链接或按ID获取链接的资源。 Ember Data支持coalescing of find requests,以减少通过ID提取相关记录所需的请求数量。
例如假设您有以下两种模型:
// app/models/deck.js
export Model.extend({
cards: hasMany()
});
// app/models/card.js
export Model.extend({
deck: belongsTo()
});
需要特定卡座的所有卡的路线的模型钩可能看起来像这样:
export Route.extend({
model({ deck_name }) {
return this.store.findRecord('deck', deck_name).then((deck) => {
deck.get('cards');
});
}
});
如果您的关系建立得不好,或者您的后端不包含相关的资源链接或资源链接,或者您不想承担其他请求的开销,则必须手动进行。我想这意味着要使用您的自定义端点来获取数据,并使用其push()
method将其推送到商店。您应该在使用模型序列化器之前对其进行反序列化。