【问题标题】:Ember serializer customization for alternate url用于备用 url 的 Ember 序列化程序自定义
【发布时间】:2016-09-26 16:42:05
【问题描述】:

我是 ember 的新手。所以这就是我所面临的。我得到了用 python/Django 编写的后端 RESTAPI。它在/api/works/ 上提供以下 json 响应

[
{
    "id": 17,
    "title": "about us",
    "description": "some project",
    "owner": "admin"
},
{
    "id": 19,
    "title": "test1 profit project",
    "description": "dev null",
    "owner": "test1"
}
]

也在详细视图中,例如:/api/works/17/:

{
"id": 17,
"title": "about us",
"description": "some project",
"owner": "admin"
}

还有/api/works/17/tasks/用于列出工作任务

[
{
    "id": 2,
    "title": "secondWorkTask",
    "description": "task2 description",
    "due_date": "2016-09-26",
    "assign": 1,
    "project": "about us"
},
{
    "id": 3,
    "title": "some task name",
    "description": "some task description",
    "due_date": "2016-08-27",
    "assign": 2,
    "project": "about us"
}
]

在前端,我使用的是 ember-cli version2.7.0 + ember-django-adapter。我可以毫无问题地获得 /api/works。

ember 上的序列化器获取项目:

export default DRFSerializer.extend({
  normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {
   payload.data = payload;
   return this._super(...arguments);
 }
});

我想要实现的是 ember 端,当 ember 端 (emberexample-app.com/app/17/) 的工作详细信息 url 加载时,它必须显示所有任务。目前我可以通过上面的序列化程序通过这个 url /api/works/17/ 获取工作细节。但是我怎样才能得到任务?请帮助我找到解决此问题的方法。

【问题讨论】:

    标签: python json django rest ember.js


    【解决方案1】:

    序列化器用于自定义数据的加载和保存(或序列化和反序列化)。

    要自定义 URL,您必须使用适配器,(例如,RESTAdapter 是我最常用的适配器)。

    这适用于您想要创建 (urlForCreateRecord) 或更新 (urlForUpdateRecord) 任务的情况,但如果您只想将 work.get('tasks') 之后的 work.get('tasks') 转换为GET http://endpoint/work/<work_id>/tasks,至少在我的情况下它并没有“正常工作”。

    我发现一个非常有效的解决方案是将属性 links 作为普通对象添加到包含指向您要作为属性检索的不同子模型的链接的父对象。

    类似这样的:

    /* app/adapters/work.js */
    import DS from 'ember';
    
    export default DS.RESTSerializer({
        normalize (model, hash, prop) {
            hash.links = hash.links || {};
            hash.links.tasks = this.buildURL(model, hash.id) + '/tasks';
            return this._super(model, hash, prop);
        }
    });
    

    在此示例中,当 Ember 尝试从工作模型中获取任务属性时,它会对 work.links.tasks 包含的 URL 进行 GET。

    【讨论】:

    • 是否可以在/api/works/17/tasks/ 中创建任务我需要更新taskserializer 以创建任务还编辑这两个函数应该存在于序列化程序中吗?当前任务创建只能在/api/works/17/tasks/ 下进行,但在编辑或删除记录时,它在/api/tasks/2/
    • 如果 DRFAdapter 扩展 DS.RESTAdapter(和 it does),则可以单独为每个操作自定义 URL,请查看 DS.RESTAdapter 中的方法 urlForDeleteRecordurlForUpdateRecord
    • urlForCreateRecord 将模型名称和快照作为参数,但我如何指定模型 ID?在后端,它像 /api/works/17/tasks 一样用于创建任务,它会自动获取工作 ID,因此在创建记录时无需发送工作或工作 ID 或类似的东西
    • 我确实关注了但在快照中我总是得到空值。它与模型有关吗? import DRFAdapter from './drf'; export default DRFAdapter.extend({ urlForCreateRecord(modelName, snapshot) { let workId = snapshot.belongsTo('work').id; return /${this.namespace}/api/works/${workId}/tasks/; } });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2012-10-26
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多