【问题标题】:How to dasherize filter URL sent by Ember query?如何对 Ember 查询发送的过滤器 URL 进行 dasherize?
【发布时间】:2023-03-16 00:03:01
【问题描述】:

我正在尝试通过开发一个简单的 TODO 管理器应用程序来学习 Ember。

我正在为这个应用程序使用 ember-data 和 JSONAPISerializer 以及手卷 REST JSON API 后端。

我有以下代表任务的模型

app/model/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 后端使用破折号名称。

此应用程序的一个基本功能是按状态过滤任务,因此基本上可以看到正在进行或已完成或所有任务。

为了只获取正在进行的任务,我在相应路由的模型钩子中有以下查询

app/routes/tasks/ongoing.js

export default Ember.Route.extend({
    model () {
        return this.get('store').query('task', {
            filter: {
                isComplete: 'false'
            }
        });
    }
});

所以当查询被发送到后端时,它是这样的

restjsonapi/tasks?filter[isComplete]=false

问题是后端期望“is-completed”而不理解“isComplete”。

有没有办法对 Ember 查询发出的 URL 进行模糊处理?

编辑(可能的解决方法):

我可能一直试图以错误的方式解决这个问题。我已将 JSON 数据更改为下划线而不是破折号,并解决了这个问题。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    当使用store.query 时,Ember 会为您的模型类型找到相关适配器并调用adapter.query,这反过来似乎将您的查询传递给jQuery.ajax 作为data 属性的值。看这里: https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L504

    然后由 jQuery 使用 encodeURIComponent 完成从对象到查询字符串的转换,如您所见:https://github.com/jquery/jquery/blob/e4fd41f8fa4190fbbb6cb98cf7ace64f6e00685d/src/serialize.js#L68

    因此,您将无法通过将选项传递给 Ember 来更改此行为。

    但是,您可以尝试以下方法:

    export default Ember.Route.extend({
        model () {
            return this.get('store').query('task', {
                filter: {
                    "is-complete": 'false'
                }
            });
        }
    }); 
    

    它应该可以工作。

    【讨论】:

    • 现在知道这有多简单,我感到很愚蠢。谢谢纳西姆!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多