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

时间:2016-11-28 21:45:49

标签: ember.js ember-data

我能否嵌套Ember数据适配器?

例如,假设我的模型//models/site.js包含模板//templates/site.hbs并且我想向query()发出自定义${ENV.APP.API_HOST}/customers/${org}/sites请求 - 根据文档我可以在query()处自定义//adapters/site.js功能。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

因此,我可以使用ember插件自定义和修复此问题 - https://github.com/amiel/ember-data-url-templates/。它具有良好的文档,允许您自定义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段拾取的参数。使用单独的queryRecord()调用Ember存储允许我根据需要指定正确的端点。

// 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 })
    });
  }
});

注意//我已使用RSVP哈希,因为可能会对同一模型进行多次调用,但您可以根据需要直接return this.get查询也是model: