【问题标题】:Backbone.model.save(): POST(create) / PUT(update) logic doesn't match application logic - how to avoid PUT in certain situations?Backbone.model.save(): POST(create) / PUT(update) 逻辑与应用程序逻辑不匹配 - 如何在某些情况下避免 PUT?
【发布时间】:2016-09-21 02:03:05
【问题描述】:

我正在使用 Backbone 和 Pyramid 创建一个 Web 应用程序(前端和后端,所以两者都在我的控制之下),通过 RESTful API 连接。

在开发过程中,我遇到过几次问题,Backbone PUT(=更新)一个新模型,而它实际上应该 POST(=创建)它。

Backbone 根据 ID 字段的存在来决定是 POST 还是 UPDATE 模型(如果当前模型中不存在 ID:-> POST/create | 如果是:PUT/update)。

但是我现在遇到了几种情况,这种行为与我的应用程序逻辑不匹配。

假设我们的主模型(及其对象永久保存在后端的关系数据库中)称为Foo,具有idfield_1field_2 等字段。

示例#1:创建Foo 的模板或预览:在创建(=POSTing)Foo 的对象之前,我可以创建并向用户显示预览和/或将其保存为模板。 这样做时,后端(在预览的情况下:临时)将对象添加到数据库并将完整模型(包括其 HTTP 响应中的 ID)返回给 Backbone。 Foo 的模板和预览对象(临时)保存到同一个表中,作为最终对象(type 列指示其类型(0 = 最终/实时,1 = 预览,2 =模板))。 现在 - 在预览/保存为模板之后 - 尝试实际创建 Foo 的对象时,Backbone 模型已经设置了 ID 字段并且实际上 PUTs 和 更新 模板或不再存在预览,而不是 POSTing 并随之在数据库中创建一个新的 Foo(如预期的那样)。

=> 解决方案 #1:调用 POST /json/preview 不会返回 ID 字段,因此 Backbone 不会混淆。

=> 解决方案 #2:覆盖 Backbone-model 中 Foo 的 parse() 以从响应中剔除 ID 字段

.=> 有点效果

示例#2:有一个Periodic 模型,它引用一个Foo-模板。 Periodic 的目的是为用户提供基于 Foo 模板每 X 个月半自动创建一个新 Foo 对象的可能性。

现在有一个调用 GET /json/periodics,它返回所有 Periodic-objects 及其嵌套的 Foo-objects (Foo-templates),包括它们的 ID,例如[{'interval': 12, template_id: 42, template: { 'id': 42, field_1: 'foo', field_2: 'bar', .. } , { .. } , .. ].

在前端,用户现在可以定期确认(或跳过)创建一个新的Foo-object,方法是发出:periodics[X].template.save() 但又是PUTs 并随之更新Foo-model,而不是POSTing 并创建一个新的(如预期的那样)。

再次在这里(如示例 1),我可以删除 FooID 字段 - 无论是在后端还是前端。

但是在某些情况下,我需要模板的id-字段,例如在实际编辑它们时,所以在这里我需要两个电话(GET /json/templates_WITHOUT_FOO-IDsGET /json/templates_WITH_FOO-IDs)。这听起来也不对。

问题是:在某些情况/视图中,避免 Backbone 错误地假设模型应该是 PUT 而不是 POSTed 的正确(和一致)方法是什么?

【问题讨论】:

  • 你可以覆盖Backbone.sync并根据你的应用逻辑做任何你想做的事情。

标签: javascript rest http backbone.js pyramid


【解决方案1】:

Backbone 的保存和获取方法只是调用 Backbone.sync 方法,而它又只是 ajax 调用的包装器。你可以通过 在 ajax 参数中使用 save 函数而不必实际 扩展它。基本上最终是这样的:

model.save({attributes you want to save}, {type:'POST', url: 'apiurl/model/:id/played'});

您必须每次都这样做,因此为您的模型扩展 Backbone.sync 可能是更好的做法。

Backbone 网站提供了一些关于我所说的关于 Backbone 同步和保存 ajax 选项的信息。我还看到了一些关于扩展同步的示例,但目前我似乎无法找到它们。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 2021-11-27
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2016-03-18
    • 2010-10-13
    相关资源
    最近更新 更多