Ember find()、query()、findAll()的数据混合

Ember Data mix of find(), query(), findAll()

如果我这样做

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),但它抛出了一个断言异常,说它需要一个模型而不是一个数组。

我假设您正在使用 RestAdapter,并且您只想对一个模型执行此操作。在这种情况下,您可以通过修改自定义适配器中 BuildURLMixin class. So if you wanted to specify the /models/foo as the url for query then you could implement urlForQuery 的方法来自定义适配器,例如:

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

编辑:如果您想完全控制您的 url,您可以自定义 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:结果查询字符串的附加方式比我想象的要晚。事实上,要做你想做的事,你将不得不为 RestAdapter 自定义 query method of your adapter. If you look at the source,你可以看到它在它调用 url:

的地方添加了查询
return this.ajax(url, 'GET', { data: query });

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

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

但您应该注意连锁效应,即根本没有应用任何查询字符串