Ember Data 1.13.5 RESTAdapter queryRecord

时间:2015-07-12 11:56:03

标签: ember.js ember-data

嗨,根据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
});

2 个答案:

答案 0 :(得分:4)

根据源代码,默认适配器没有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 shold作为第4个参数传递;
  • 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方法中将null参数替换为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位于同一个适配器中。

答案 1 :(得分:0)

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,查看升级指南,看看是否需要进行任何操作   更改,然后在您的Serializer上设置一个临时标志:   isNewSerializerAPI。这将选择您进入新的序列化程序API。   一旦你进入Ember Data 2.0列车,新的Serializer API就是   默认值为1,不需要标记。