是否可以在 EmberJS 中创建嵌套适配器?

Is it possible to create a nested adapter in EmberJS?

我可以嵌套 Ember 数据适配器吗?

例如,假设我有一个带有模板 //templates/site.hbs 的模型 //models/site.js,并且我想向 ${ENV.APP.API_HOST}/customers/${org}/sites 发出自定义 query() 请求 - 根据文档我可以简单地在 //adapters/site.js.

自定义 query() 函数

但是,如果我在 //templates/sites/show.hbs 处有第二个模板并且我需要查询第二个截然不同的端点,例如 ${ENV.APP.API_HOST}/customers/${org}/sites/${id}(或任何其他深度嵌套的数据端点),我可以设置一个适配器吗在 //adapters/sites/show.js 之下?我目前似乎无法通过 Ember 数据实现这一目标。

据我所知,Ember 目前不支持嵌套端点。相关讨论:1, 2.

所以我能够使用 ember 插件自定义和修复此问题 - https://github.com/amiel/ember-data-url-templates/. It has good documentation and allows you to customise URL segments.

我的站点适配器

// adapters/site.js
export default ApplicationAdapter.extend({
  urlTemplate: '{+host}/api/{apiVersion}v1/customers{/org}/sites{/site}',
  queryUrlTemplate: '{+host}/api/{apiVersion}v1/customers{/org}/sites'
});

还有我的服务适配器

// adapters/service.js
export default ApplicationAdapter.extend({
  urlTemplate: '{+host}/api/{apiVersion}v1/customers{/org}/services{/service}',
});

然后在我的路线中,由于 ember-data-url-templates,我加载了适配器中 URL 段拾取的参数。对 Ember 存储使用单独的 queryRecord() 调用允许我根据需要指定正确的端点。

// routes/sites.js
export default Ember.Route.extend({
  model: function(params) {
    let siteQuery = this.modelFor('sites');
    let org = siteQuery.customer_orgCode;
    return RSVP.hash({
      site: this.get('store').queryRecord('site', { org: org, site: params.site_id })
    });
  }
});

// routes/sites/show.js
export default Ember.Route.extend({
  model: function(params) {
    let siteQuery = this.modelFor('sites');
    let org = siteQuery.customer_orgCode;
    return Ember.RSVP.hash({
      service: this.get('store').queryRecord('service', { org: org, service: params.instance_id })
    });
  }
});

NB // 我使用了 RSVP 哈希,因为同一模型可能有多个调用,但您可以根据需要直接 return this.get 查询直接到 model: 还有。