Eri*_*ric 4 validation backbone.js
根据有关验证的主干文档,它指出:
如果validate返回错误,则不会继续设置和保存,并且不会修改模型属性.
因此,如果验证失败,我读取该集或保存的方式永远不会运行.但这不是我得到的结果.即使验证失败,它仍然会发送POST/PUT请求.我在我的代码中读错文档或做错了吗?
这是我的相关代码:https: //gist.github.com/80f6ef0099fbe96025dc
App.Models.Test = Backbone.Model.extend(
urlRoot: '/api/test'
validate: (attrs) ->
errors = []
if attrs.to is ''
errors.push
name: "to"
field: "js-to"
message: "You must enter a to address"
if attrs.subject is ''
errors.push
name: "subject"
field: "js-subject"
message: "You must enter a subject"
# Return our errors array if it isn't empty
errors if errors.length > 0
)
App.Views.Details = Backbone.View.extend(
initialize: ->
@model.bind "error", @error, this
events:
"click #js-save": "saveItem"
saveItem: (e) ->
e.preventDefault()
# Set the model then save it.
@model.set
subject: $("#js-subject").val()
message: $("#js-message").val()
mailbox_id: $("#js-from").val()
to: $("#js-to").val()
cc: $("#js-cc").val()
bcc: $("#js-bcc").val()
tags: App.Helpers.tagsToObject $('#js-tags').val()
scope: $('#js-scope').val()
attachments: attachments
@model.save null,
success: (model, response) =>
App.Helpers.showAlert "Success!", "Saved Successfully", "alert-success"
@next()
error: (model, response) ->
App.Helpers.showAlert "Error", "An error occurred while trying to save this item", "alert-error"
# Show the errors based on validation failure.
error: (model, error) ->
App.Helpers.displayValidationErrors error
Run Code Online (Sandbox Code Playgroud)
您这样做是为了保存您的模型:
@model.save null,
success: -> ...
error: -> ...
Run Code Online (Sandbox Code Playgroud)
这null是你的麻烦,使用的源泉,{}事情会开始变得更好; 如果你把你的@model.set和@model.save电话结合起来,事情会变得更好:
attrs =
subject: $("#js-subject").val()
#...
@model.save attrs,
success: -> ...
error: -> ...
Run Code Online (Sandbox Code Playgroud)
一个save调用如下:
节省
model.save([attributes], [options])
[...]
的属性散列(如set)应该包含你想改变属性
因此传递nullfor attributes表示您希望保存模型.
当你save是一个模型时,验证基本上就是这样set,代码如下所示:
if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
你attrs会被null这样set就不会被调用; 但是,如果你让你save处理set,你会得到你所追求的行为.如果您传递了该wait: true选项,save则会手动对传递的属性运行验证:
if (options.wait) {
if (!this._validate(attrs, options)) return false;
...
}
Run Code Online (Sandbox Code Playgroud)
内部_validate方法是一个包装器,用于validate执行一些簿记和错误处理.你没有使用,wait: true所以这不适用于你,但我认为无论如何都值得一提.
考虑一个validate总是失败的模型的简单示例.如果你这样说:
@model.on 'error', @error
@model.save attrs,
success: -> console.log 'AJAX success'
error: -> console.log 'AJAX error'
Run Code Online (Sandbox Code Playgroud)
然后@error将被调用,因为save最终会调用set与一些属性,并set会调用validate.演示:http://jsfiddle.net/ambiguous/HHQ2N/1/
但是,如果你说:
@model.save null, ...
Run Code Online (Sandbox Code Playgroud)
这null 将导致set调用被跳过.演示:http://jsfiddle.net/ambiguous/6pX2e/(这里的AJAX会失败).
您@model.set之前的呼叫@model.save应该触发您的错误处理程序,但如果您不检查@model.set返回的内容,执行将盲目地继续save呼叫并与您的服务器通信.
总之,这里有三件事:
save按照自己应有的方式打电话.@model.set返回值并失去了捕获验证错误的机会.save(null, ...)可能会更好但我不知道是否值得努力处理一种奇怪的方式来调用它.你应该将你的set//save组合成一个save或检查什么set返回.
| 归档时间: |
|
| 查看次数: |
1565 次 |
| 最近记录: |