如何在Ember.js中的适配器中使用路由的参数?

时间:2018-10-17 21:20:42

标签: ember.js

想象一下,我们有一个应用程序,允许用户收集卡并制作其卡组。

另外,假设我们在路由器中:

this.route('cards');
this.route('decks', function() {
    this.route('deck', {path: ':deck_name'});
});

和两个API端点:

  1. GET /cards-查询用户控制的所有卡
  2. GET /decks/:deck_name/cards —用用户控制的特定deck_name查询卡组中的所有卡牌

我们有一个card模型,并希望根据当前路由(向我们应用/cards路由的第一个端点,向{{1} }路线)

如何为/decks/:deck_name模型编写适配器以根据路由查询正确的端点?

换句话说,如何使用一个 Ember模型(用于卡)并将DS适配器指向不同的端点(例如,通过更改适配器的card)取决于Ember Web应用程序中的当前路线?


我们使用Ember v2.18。

1 个答案:

答案 0 :(得分:0)

根据评论中的约定,我们假设您的API实现了JSON API specification

如果我说对了,您有一个decks模型,该模型与cards模型具有一对多的关系。您的API为decks记录返回的resource object应该包含该关系的relationships object。这可以提供related resource link(允许提取相关记录),也可以提供resource identifiersresource 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将其推送到商店。您应该在使用模型序列化器之前对其进行反序列化。