我正在使用Backbone和Pyramid创建一个Web应用程序(前端和后端,因此两者都在我的控制之下),通过RESTful API连接。
在开发过程中,我现在遇到过几次问题,其中Backbone PUT(=更新)一个新模型,而它实际上应该POST(=创建)它。
Backbone决定是否根据ID
字段的存在来POST或更新模型(如果当前模型中没有ID
: - > POST / create |如果是这样:PUT /更新)。
但是我现在遇到了几种情况,这种行为与我的应用程序逻辑不匹配。
让我们说我们的主模型(及其对象被持久保存在后端的关系数据库中)被称为Foo
,其中包含id
,field_1
等字段, field_2
。
示例#1 :创建Foo
的模板或预览:在创建{= POST
对象Foo
之前,我可以创建和向用户显示预览和/或将其另存为模板。
在执行此操作时,后端(在预览的情况下:暂时)将对象添加到数据库并将完整模型(包括其HTTP响应中的ID
)返回Backbone。
Foo
的模板和预览对象(暂时)保存到同一个表中,作为最终对象(列type
表示其类型(0
= final / live,{{1} } =预览,1
=模板))。
现在 - 在预览/保存为模板后 - 尝试实际创建2
的对象时,Backbone模型已经设置了Foo
字段,实际上ID
和更新< / em>模板或不再存在的预览,而不是PUT
和在数据库中创建新的POST
(按预期)。
=&GT;解决方案#1 :调用POST / json / preview不会返回Foo
字段,因此Backbone不会感到困惑。
=&GT;解决方案#2 :在Backbone模型中覆盖Foo的parse()以从响应中踢出ID字段
=&GT。有点工作
示例#2 :拥有ID
模型,该模型引用Periodic
- 模板。 Foo
的意图是为用户提供每X个月基于Periodic
- 模板半自动创建新Foo
对象的可能性。
现在有一个调用GET / json / periodics,它返回所有Foo
- 对象及其嵌套的Periodic
- 对象(Foo
- 模板),包括它们的ID,例如Foo
。
在前端,用户现在可以通过发出:[{'interval': 12, template_id: 42, template: { 'id': 42, field_1: 'foo', field_2: 'bar', .. } , { .. } , .. ]
来定期确认(或跳过)创建新的Foo
- 对象,然而periodics[X].template.save()
再次PUT
更新Foo
1}} - 模型,而不是POST
和创建一个新的(按预期)。
再次(如示例1所示),我可以在后端或前端删除ID
的{{1}}字段。
但是在某些情况下,我需要 Foo
- 模板字段,例如实际编辑时,我需要进行两次调用(id
和GET /json/templates_WITHOUT_FOO-IDs
)。这听起来也很不对。
问题是:在某些情况下假设模型应该是GET /json/templates_WITH_FOO-IDs
而不是PUT
,这是正确(并且一致)避免使用Backbone的方法/ views?
答案 0 :(得分:0)
Backbone的save和fetch方法只是调用Backbone.sync 方法,它只是ajax调用的包装器。你可以通过 在ajax参数中使用save函数而不必实际 延伸它。基本上最终会是这样的:
model.save({attributes you want to save}, {type:'POST', url: 'apiurl/model/:id/played'});
每次都必须这样做,所以为您的模型扩展Backbone.sync可能是更好的做法。
Backbone网站提供了一些关于我所谈论的关于Backbone同步和保存ajax选项的信息。我在扩展同步时也看到了一些例子,但我现在似乎无法追踪它们。