我正在尝试通过开发一个简单的TODO管理器应用程序来学习Ember。
我正在使用ember-data和JSONAPISerializer,并为此应用程序提供一个手动REST JSON API后端。
我有以下代表任务的模型
应用程序/模型/ task.js
export default DS.Model.extend({
title: DS.attr ('string'),
description: DS.attr ('string'),
isComplete: DS.attr ('boolean')
});
来自后端的相应JSON数据如下所示
{
"data": [{
"id": "1",
"type": "task",
"attributes": {
"title": "Complete Ember TODO manager application",
"description": "Build a simple Ember application for easily managing tasks",
"is-complete": "false"
}
}]
}
根据惯例,Ember模型使用驼峰名称,JSON API后端使用dasherized名称。
此应用程序的一个基本功能是按状态过滤任务,因此基本上可以看到正在进行的任务或已完成的任务或所有任务。
对于仅获取正在进行的任务,我在相应路径的模型钩子中有以下查询
应用程序/路由/任务/ ongoing.js
export default Ember.Route.extend({
model () {
return this.get('store').query('task', {
filter: {
isComplete: 'false'
}
});
}
});
因此,当查询发送到后端时,它将作为
restjsonapi/tasks?filter[isComplete]=false
问题是后端需要“完成”并且不理解“isComplete”。
有没有办法对Ember查询发出的网址进行划分?
我可能一直试图以错误的方式解决这个问题。我已经将JSON数据更改为下划线而不是破折号并解决了这个问题。
答案 0 :(得分:0)
使用store.query
时,Ember会为您的模型类型找到相关的适配器并调用adapter.query
,而jQuery.ajax
似乎会将您的查询作为data
的值传递给encodeURIComponent
属性。看这里:
https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L504
然后由jQuery使用export default Ember.Route.extend({
model () {
return this.get('store').query('task', {
filter: {
"is-complete": 'false'
}
});
}
});
完成从Object到Query String的转换,如您所见:https://github.com/jquery/jquery/blob/e4fd41f8fa4190fbbb6cb98cf7ace64f6e00685d/src/serialize.js#L68
因此,您无法通过将选项传递给Ember来改变此行为。
但是,您可以尝试以下方式:
createContainer
它应该有用。