Ember-Cli:使用前缀添加findAll()查询

时间:2016-01-17 03:15:22

标签: ember.js ember-data ember-cli

在我的某条路线中,我需要findAll()用户的Items,但不必提出标准/items请求,而是必须转到/my/items

我目前的解决方案包括:

// routes/my/item.js
export default Ember.Route.extend({
    model() {
        this.store.unloadAll('item');
        return Ember.$.getJSON('/my/items').then((payload) => {
          this.store.pushPayload(payload);
          return this.store.peekAll('item');
        });
    }
});

但不幸的是,它并不理想,因为它在发出请求之前需要unloadAll() 以确保模型在卸载任何缓存时仅返回新获取的记录。

更好的解决方案可能涉及专门为此路由创建自定义适配器并覆盖findAll()方法或urlForFindAll(),但我不确定如何正确创建和导入此类自定义适配器。

仅仅为了测试我覆盖了默认的Item适配器,并在路由模型中返回findAll('item'),一切正常,请求前缀为/my/

// adapters/item.js
findAll: function(store, type, sinceToken, snapshotRecordArray) {
  var query, url;
  if (sinceToken) { query = { since: sinceToken }; }

  // prefix url with `my` str
  url = `my${this.buildURL(type.modelName, null, null, 'findAll')}`;
  return this.ajax(url, 'GET', { data: query });
},

// routes/my/item.js
export default Ember.Route.extend({
  model() {
    return this.store.findAll('item');
  }
});

..但显然会覆盖此模型的所有findAll()个查询,其中我只需要在此路径中进行自定义查询。

1 个答案:

答案 0 :(得分:2)

这可以通过使用adapterOptions使用findAll将选项传递到项目的适配器来解决:

1)在路由中使用adapterOption将前缀传递给适配器:

return this.store.findAll('item', { adapterOptions: { prefix: 'my' } });

2)在ember-cli中使用ember g adapter item覆盖项目的默认适配器。

3)如果传递了这样的选项,在适配器中将默认findAll覆盖为前缀url:

// /app/adapters/item.js
import ApplicationAdapter from './application';

export default ApplicationAdapter.extend({
  findAll: function(store, type, sinceToken, snapshotRecordArray) {
    var query, url;
    if (sinceToken) { query = { since: sinceToken }; }

    let prefix = Ember.get(snapshotRecordArray, 'adapterOptions.prefix');
    url = `${prefix || ''}${this.buildURL(type.modelName, null, null, 'findAll')}`;

    return this.ajax(url, 'GET', { data: query });
  },
});

4)成功,this.store.findAll('item', { adapterOptions: { prefix: 'my' } });现在将my/items代替items