【问题标题】:Ember Data 1.13.5 RESTAdapter queryRecordEmber Data 1.13.5 RESTAdapter 查询记录
【发布时间】:2015-07-20 22:43:06
【问题描述】:

您好,根据 ember ds 1.13 发布文档:

如果您的应用使用的是原生 JSONSerializer 或 RESTSerializer, 您无需进行任何更改,您的应用程序将继续 工作。现有的序列化程序已向后更新 将 JSON API 数据返回到商店的兼容方式。

目前我是默认的 RESTAdapter:

export default DS.RESTAdapter.extend({
    host: 'http://localhost:9990',    
    namespace: 'api/v1'
});

哪个模型有一个自定义的 serailzer:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    comments: { embedded: 'always' }
  }
});

当我尝试使用新的 queryRecord 方法时:

this.store.queryRecord('discussion',{ titleid: self.get('title_id')});

我在日志中得到以下异常:

Error while processing route: title.index Assertion Failed: You tried to make a query but your adapter does not implement `queryRecord` Error: Assertion Failed: You tried to make a query but your adapter does not implement `queryRecord`
    at new Error (native)
    at Error.EmberError (http://localhost:4200/assets/vendor.js:25705:21)
    at Object._emberMetalCore.default.assert (http://localhost:4200/assets/vendor.js:15895:13)
    at ember$data$lib$system$store$$Service.extend.queryRecord (http://localhost:4200/assets/vendor.js:80502:15)
    at loadDiscussionModel (http://localhost:4200/assets/ui.js:2728:32)
    at renderTemplate (http://localhost:4200/assets/ui.js:2715:12)
    at _emberRuntimeSystemObject.default.extend.setup (http://localhost:4200/assets/vendor.js:37282:14)
    at Object.callHook (http://localhost:4200/assets/vendor.js:65078:38)
    at handlerEnteredOrUpdated (http://localhost:4200/assets/vendor.js:63868:12)
    at setupContexts (http://localhost:4200/assets/vendor.js:63836:9)

序列化器/application.js

import DS from 'ember-data';
export default DS.RESTSerializer.extend({
  serialize: function(record) {
    return this._super(record, {includeId: true});
  },
  isNewSerializerAPI: true
});

【问题讨论】:

  • 您是否在应用程序序列化程序中尝试isNewSerializerAPI: true
  • 部分工作发布了下面的答案。但是,原来的错误仍然存​​在。

标签: ember.js ember-data


【解决方案1】:

根据源码默认适配器没有queryRecord方法的实现:https://github.com/emberjs/data/blob/e89732a5aefb6a81b46927da1c6f048f4aede85e/packages/ember-data/lib/system/adapter.js#L226

它也没有在 RESTAdapter 中定义,也没有在新的 JSONAPIAdapter 中定义。在我看来,这是因为查询请求对于每个项目来说都过于具体,因此很难一概而论。

但文档包含解释和实现示例:http://emberjs.com/api/data/classes/DS.Adapter.html#method_queryRecord 顺便说一下,有两个错误:

  • id 应该作为第四个参数传递;
  • type.typeKey 应替换为 typeClass.modelName。

我们更喜欢在我们自己的项目中使用更简单的实现:

export default DS.RESTAdapter.extend({
  ...
  queryRecord: function(store, type, query, id) {
    return this.ajax(this.buildURL(type.modelName, id, null, 'query', query), 'GET');
  }
});

如果需要,您可以在 buildUrl 方法中将 id 参数替换为 null。

更新

我忘了提一下,在 ember-data 1.13.5 RESTAdapter 的默认 urlForQuery 实现中返回 url 而没有传递实际的查询参数。 所以这里是基于默认 _buildUrl 方法的实现,id 替换为查询:

urlForQuery: function(query, modelName) {
  var url = [];
  var host = this.get('host');
  var prefix = this.urlPrefix();
  var path;

  if (modelName) {
    path = this.pathForType(modelName);
    if (path) {
      url.push(path);
    }
  } 


  if (prefix) {
    url.unshift(prefix);
  }

  url = url.join('/');
  if (!host && url && url.charAt(0) !== '/') {
    url = '/' + url;
  }

  if (query) {
    var queryParams = [];
    for(var paramName in query) {
      if(query.hasOwnProperty(paramName)) {
        queryParams.push(paramName + '=' + encodeURIComponent(query[paramName]))
      }
    }
    if(queryParams.length > 0) {
      url = url + '?' + queryParams.join('&');
    }
  }

  return url;
}

此方法与原始答案中的 queryRecord 位于同一适配器中。

【讨论】:

【解决方案2】:

isNewSerializerAPI: true 添加到所有相关模型序列化程序在一定程度上工作(它删除了下面所述的错误)。但是还是会出现原来的错误。

之前由于导入不正确,控制台日志中的以下错误未显示。

错误:断言失败:正在使用 旧的序列化程序 API 和期望 它与它合作做同样的事情。确保设置 isNewSerializerAPI: true 如果您愿意,请在您的自定义序列化程序中 使用新的 Serializer API。

另外,根据文档,此标志在 Ember Data 2.0 中不需要:

http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html

如果你已经自定义了你的序列化器,你应该升级到 Ember 数据1.13,查看升级指南看是否需要做任何 更改,然后在您的序列化程序上设置一个临时标志: isNewSerializerAPI。这将使您选择使用新的序列化程序 API。 一旦您踏上 Ember Data 2.0 列车,新的 Serializer API 就是 默认一个,不需要flag。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多