如何在Ember中通过id和查询参数找到记录

How to find a record both by id and query parameters in Ember

本文关键字:查询 参数 记录 id Ember      更新时间:2023-09-26

我正试图使用ember数据通过id和查询参数向端点发送请求。ajax调用的最终输出将是http://api.example.com/invoices/1?key=value。据我所知,ember数据的store没有通过id和查询参数找到的本地方法(以下两种方法都不起作用):

// outputs http://api.example/com/invoices/1
this.store.find('invoice', 1);
// outputs http://api.example.com/invoices?id=1&key=value
this.store.find('invoice, {id: 1, key: value});

相反,我一直在尝试修改发票适配器。我们的后端是Django,所以我们使用ActiveModelAdapter。我想覆盖构建url的方法,这样,如果query对象中存在id,它将自动删除它并将其附加到url,然后再将query对象的其余部分转换为url参数。

唯一的问题是我不知道该重写哪种方法。我在这里查看了ActiveModelAdapter的文档,并尝试覆盖findRecordbuildUrlurlForFindurlForQuery方法,但由于某种原因,它们都没有被调用(我尝试通过console.logEmber.debug进行日志记录)。我知道适配器工作正常,因为namespace正在工作。

这是我的适配器文件:

import DS from 'ember-data';
import config from '../config/environment';
export default DS.ActiveModelAdapter.extend({
  namespace: 'v1',
  host: config.apiUrl,
  // taken straight from the build-url-mixin and modified
  // very slightly to test for logging
  urlForFindRecord: function(id, modelName, snapshot) {
    Ember.debug('urlForFindRecord is being called');
    if (this.urlForFind !== urlForFind) {
      Ember.deprecate('BuildURLMixin#urlForFind has been deprecated and renamed to `urlForFindRecord`.');
      return this.urlForFind(id, modelName, snapshot);
    }
    return this._buildURL(modelName, id);
  },
  // taken straight from the build-url-mixin and modified
  // very slightly to test for logging
  findRecord: function(store, type, id, snapshot) {
    Ember.debug('findRecord is being called');
    var find = RestAdapter.prototype.find;
    if (find !== this.find) {
      Ember.deprecate('RestAdapter#find has been deprecated and renamed to `findRecord`.');
      return this.find(store, type, id, snapshot);
    }
    return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET');
  },
  // taken straight from the build-url-mixin and modified
  // very slightly to test for logging
  urlForQuery: function(query, modelName) {
    Ember.debug('urlForQuery is being called');
    if (this.urlForFindQuery !== urlForFindQuery) {
      Ember.deprecate('BuildURLMixin#urlForFindQuery has been deprecated and renamed to `urlForQuery`.');
      return this.urlForFindQuery(query, modelName);
    }
    return this._buildURL(modelName);
  },
  // taken straight from the build-url-mixin and modified
  // very slightly to test for logging
  _buildURL: function(modelName, id) {
    Ember.debug('_buildURL is being called');
    var url = [];
    var host = get(this, 'host');
    var prefix = this.urlPrefix();
    var path;
    if (modelName) {
      path = this.pathForType(modelName);
      if (path) { url.push(path); }
    }
    if (id) { url.push(encodeURIComponent(id)); }
    if (prefix) { url.unshift(prefix); }
    url = url.join('/');
    if (!host && url && url.charAt(0) !== '/') {
      url = '/' + url;
    }
    return url;
  },
});

有没有一种更简单的方法可以在不重写适配器方法的情况下完成我想要做的事情?如果没有,我需要覆盖哪些方法

提前感谢您的帮助!

您可以使用this.store.findQueryOne('invoice',1,{key:value});

https://github.com/emberjs/data/pull/2584