Ember数据混合find(),query(),findAll()

时间:2016-09-21 20:48:25

标签: ember.js ember-data ember-router ember-model

如果我这样做

this.get('store').findAll('model')

它会向/models发出请求,并期望array。另一方面,如果我做

this.get('store').find('model', my_id)

它会向/models/my_id发出请求,它会期望我的模型有一条记录。方法.query()基本上会执行GET请求,其中包含我传递的参数

this.get('store').query('model', {something: 'foo'})

它会向/models?something=foo提出请求。

我的问题如下:

我可以制作混合上述三种方法的东西吗?我想向路径/models/foo发出请求,我想要一个数组。

我做了.find('model', params.something),但它抛出了一个断言异常,说它期待一个模型而不是一个数组。

1 个答案:

答案 0 :(得分:4)

我假设您正在使用RestAdapter而您只想为一个型号执行此操作。在这种情况下,您可以通过修改BuildURLMixin类的方法来自定义适配器。因此,如果您想将/ models / foo指定为查询的url,那么您可以在自定义适配器中实现urlForQuery,如:

urlForQuery(query, modelName) {
  return '/models/foo';
},

编辑:如果您想要完全控制您的网址,可以自定义buildUrl

buildURL(modelName, id, snapshot, requestType, query) {
  switch (requestType) {
    case 'query':
      return '/models/' + query.something;
    default:
      return this._super();
  }
},

然后你打电话:

 this.get('store').find('model', {something: 'foo'})

它会命中/ models / foo 而没有查询字符串。

EDIT2:原来查询字符串的追加方式比我想象的要晚。事实上,要做你想做的事情,你必须自定义适配器的query方法。如果您查看RestAdapter的source,您会看到它在调用url时添加查询:

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

因此您可以将其自定义为:

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

但你应该知道敲击效果,即根本不应用任何查询字符串