通过DS.store方法请求特定的嵌套URL

时间:2017-02-20 20:23:28

标签: javascript ember.js

我在路线中有以下代码:

  model(params) {
    return this.store.findRecord('user', params.id)
  }

如何预期,它要求:

/用户/ {somethingId}

但我在外部api中的路由是嵌套的,它看起来像:

/伙伴/ {somethingId} /用户

因此,我需要提出一些请求:

/ partners / {somethingId} / users / partners / {somethingId} / users / {userId}

我试过Ember的关系,但它对我没有帮助。我得到了params的网址:

return this.store.findRecord('partner', params.id, {include:'users'});
// api/partners/5?include=users

我还尝试了方法store.adapterFor,它在每次请求之前立即更改了我的适配器的命名空间:

this.store.adapterFor('application').set('namespace', '/api/partners/' + params.id);

但是在每次请求之前做这件事都很脏,所以我不想这样做。

我知道我可以使用类似ajax-ember的东西,但我想使用DS.store和适配器。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您需要为user模型创建适配器并覆盖urlForFindRecord

应用程序/适配器/ user.js的

import DS from 'ember-data';

export default DS.JSONAPIAdapter.extend({
  urlForFindRecord(id, modelName, snapshot) {
    let baseUrl = this.buildURL();
    return `${baseUrl}/partners/${id}/users`;
  }
});

答案 1 :(得分:1)

不幸的是,ember数据不支持资源的嵌套URL,没有简单的解决方案。您有3个选择:

  1. 正如其他答案中所建议的那样,为每个这样的资源创建适配器并覆盖buildUrl方法。
  2. 放弃包含数据并使用Ember.$.ajax请求。您仍然可以使用ember数据进行缓存(像往常一样描述模型并使用DS.Store.pushPayload,DS.Store.hasRecordForId,DS.Store.peekRecord,DS.Store.peekAll等方法)。
  3. 更改后端以支持可与ember数据配合使用的端点。
  4. 如果3不是一个选项,我建议2.在我看来,ember数据对于现实生活项目来说限制太多,特别是对于你不能重写后端的情况(无法控制它)。

相关问题