Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js:将更改的模型id保存到服务器的最佳方法_Javascript_Rest_Backbone.js - Fatal编程技术网

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中对其进行修改,那么每个函数只需添加一行代码