如何在不使用过滤器的情况下请求资源的关系?

时间:2016-10-13 15:53:43

标签: ember.js ember-data

我有一个遵循JSON API规范的后端。

在我的Ember应用程序中,我做了类似的事情:

model() {
  return this.store.query('category', { filter: { forum: 'main' } });
}

这很有效,发送到服务器的请求是GET /categories?filter[forum]=main。我的应用从ID为main的论坛中获取所有类别。

现在,我想从模型中创建一个GET /forums/main/categories,而不是之前的请求。如何用Ember Data在Ember中完成这个?

这是我尝试使用Ember AJAX的东西:

ajax: Ember.inject.service(),

model() {
  return Ember.RSVP.hash({
    categories: this.get('ajax').request('/forums/main/categories'),
  });
}

请求正常,从服务器返回正确的数据。但是Ember Data对此并不了解,我也无法在模板中使用该模型。如何使Ember AJAX与Ember Data一起使用?

Ember AJAX GitHub页面建议编写类似的内容:

import DS from 'ember-data';
import AjaxServiceSupport from 'ember-ajax/mixins/ajax-support';

export default DS.JSONAPIAdapter.extend(AjaxServiceSupport);

https://github.com/ember-cli/ember-ajax#usage-with-ember-data

但它似乎没有改变任何东西。

1 个答案:

答案 0 :(得分:1)

好的,/forums/main/categories看起来有点像关系链接。像forum一样也是一个模型,并且具有关系类别。这是对的吗?

如果是,可能最好的方法是首先获取forum然后再获取关系。也许你已经有了forum记录?所以像这样:

store.findRecord('forum', 'main').then(forum => forum.get('categories'));

但是,如果您想根据论坛字符串过滤categories,也可以这样做。所以基本上你想要这样做:

this.store.query('category', { filter: { forum: 'main' } });

但它应该请求/forums/main/categories而不是/categories?filter[forum]=main。这可以使用自定义适配器完成。可能你只需要覆盖urlForQuery

urlForQuery(query, modelName) {
  if(query.filter.forum)
    const forum = query.filter.forum;
    delete query.filter.forum;
    return `/forums/${forum}/categories`
  } else {
    return this._super(...arguments);
  }
},