在我的某条路线中,我需要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()
个查询,其中我只需要在此路径中进行自定义查询。
答案 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
!