Javascript Backbone.js:将更改的模型id保存到服务器的最佳方法
我想允许用户更改集合中模型的Javascript Backbone.js:将更改的模型id保存到服务器的最佳方法,javascript,rest,backbone.js,Javascript,Rest,Backbone.js,我想允许用户更改集合中模型的id 然后我遇到了一个问题,当我调用model.save()时,模型被保存到了错误的位置。它是put到新id的url,而不是到旧id的url var model = collection.get('oldid'); model.set({id: 'newId'}); // set by the user through the ui model.save(); 这将保存到collectionUrl/+'newId'而不是collectionUrl/+'olid' 我
id
然后我遇到了一个问题,当我调用model.save()
时,模型被保存到了错误的位置。它是put
到新id的url,而不是到旧id的url
var model = collection.get('oldid');
model.set({id: 'newId'}); // set by the user through the ui
model.save();
这将保存到collectionUrl/+'newId'
而不是collectionUrl/+'olid'
我想将{id:'newId'}保存(放置)到旧url
最一致的方法是什么?我认为任何框架、服务器端或客户端都不会支持这种开箱即用的方法。最好的方法是对服务器上自己的端点执行自己的AJAX请求。我会问你为什么需要这样做,我想不出任何理由这是个好主意。这是一个非常边缘的案例,没有最佳实践 我会尝试覆盖和/或使主干网以这种方式运行。当直接保存到本地数据库时,我在Air应用程序中使用主干时也做了类似的事情 --编辑
或者可能。这也可以通过在模型的保存方法中将wait选项设置为true来实现。
这可以防止模型的url更改,直到服务器返回一个带有新id的更新表示。我已经尝试过了,它似乎工作得很好 这有点迂回,但您可以创建一个单独的唯一id(使用模型的idAttribute指定),然后“id”只是另一个属性 大多数(所有…?)框架都假定id是唯一且不变的
只要知道更改id有很多含义。其他对象对该id的任何引用现在都将被破坏,引用以前id的URL将被破坏,等等。知道客户端为什么要更改该id吗?我觉得这里面有点滑稽。我认为id应该表示一个键(通常是主键),该键与服务器端的表/集合中的行/文档关联。当您在客户端保存主干模型并将其附加到服务器响应上的模型时,应在服务器端生成id。用户不能更改id,否则您将遇到上述问题。用户应该可以选择更改
id
(应该可以更改主键)到另一个独特的id@innotune:我想不出用户可以更改id的原因。如果仅更改id就足够了,请销毁旧记录并创建新记录。您是否真的希望在url中显示某种人类可读的名称?在这种情况下,您应该在控制器中匹配/collection/:name
,并从集合中搜索匹配的名称。让id/cid按原样工作。@innotune:id不是文件名。通常认为它在记录的生存期内是不可更改的。标准的restful方法是向服务器发送一个带有{id:'newId'}的PUT/oldid。我认为您不需要自定义ajax请求。@innotune:您考虑过两个客户端更新同一条记录的情况吗?第二个客户端在尝试更新由于第一个客户端的更新而id刚刚更改的记录时仍会引用旧id。您是对的,这是一个问题,但当一个用户删除记录时,仍然会发生这种情况。在我开发的应用程序中,每个用户只能访问他的私人记录。感谢您指出这一点您是对的,最后我不得不修改save
、url
和set
方法。如果有人对这个源代码感兴趣,您可以在这里找到它。如果在backbone.js中对其进行修改,那么每个函数只需添加一行代码