如何破译Ember查询发送的过滤网址?

时间:2016-08-09 08:38:29

标签: ember.js ember-data

我正在尝试通过开发一个简单的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数据更改为下划线而不是破折号并解决了这个问题。

1 个答案:

答案 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

它应该有用。