嗨,根据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
});
答案 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 顺便说一下,有两个错误:
我们更喜欢在自己的项目中使用更简单的实现:
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,不需要标记。