【问题标题】:Backbone.js server-side validation and other server-side errorsBackbone.js 服务器端验证和其他服务器端错误
【发布时间】:2011-10-04 19:50:26
【问题描述】:

遇到服务器端错误(例如验证错误)时如何回滚模型更改?

鉴于必须在服务器端完成某些验证,使用backbone.js(Rails 后端)执行此操作的适当方法是什么?

保存主干模型时,会触发客户端验证,以在验证失败时提供适当的用户体验(该模型的视图不会更新)。但是,如果服务器端验证失败,则模型及其所有视图在 PUT 到服务器之前已经更新(使用无效数据)。

这似乎有一些问题。

  1. 在模型经过服务器端验证之前更新所有视图。 例如,如果您有一个带有弹出编辑的模型列表 对话框,列表中的模型可能会更新 调用 Model.save 之后但在它之前的不可验证信息 已经过服务器端验证和 PUT。
  2. 如果服务器返回错误(例如 422 错误),则不会发生模型“回滚”。无法验证的数据就像粪便一样坐在那里。这真的很糟糕。

我使用backbone.js 错了吗?是否有一种众所周知的方法来处理这种(非常常见的)场景?我知道我可以对旧值等进行一些手动缓存,但这是一种很糟糕的解决方案。

谢谢!

【问题讨论】:

标签: ruby-on-rails backbone.js


【解决方案1】:

不知道我是否做错了(BackboneJS 的新手),但我遇到了同样的问题,我是这样解决的:

  • 我在服务器端进行所有验证

  • 我没有执行普通的 model.save,而是对服务器进行标准 ajax 调用并返回错误消息或包含修改后模型属性的成功消息。如果成功了,我就可以用返回的属性做model.set,以更新模型和相应的视图。

  • 如果您想先进行客户端验证,我想您可以使用 { silent: true } 选项进行保存,这样视图就不会更新,然后进行 ajax 调用,看看需要什么根据响应完成(如果错误则恢复模型的原始值,如果成功则更新视图)

希望这会有所帮助。

ps:这可行,但感觉不“干净”。如果有更好的解决方案,我也很乐意阅读它

【讨论】:

  • 我不知道 {silent: true} 参数。这可能有助于在中间状态下保持视图的更新。我同意,其余的感觉不“干净”:P 对不起,我不能“投票”;我还没有足够的声望。
【解决方案2】:

我要做的是在服务器端确保捕获任何错误,然后从数据库返回原始记录的响应查询,并将其作为 JSON 与错误响应一起返回。然后你可以这样做:

model.save({}, {
  error: function(model, response){
    model.set(response);
  }
});

假设您的视图随后会监视模型上的更改事件,它们会相应地更新。

【讨论】:

  • 这对某些错误子类有好处(我开始沿着这条路走),但对于某些错误,返回对象的表示可能不可行或不合适(例如传输级错误或'访问被拒绝'或'未登录'之类的东西)。不过,可能最终会因为一些错误而这样做;它肯定有助于正常的服务器端验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2014-06-29
相关资源
最近更新 更多