我已经设置了我的模型验证,如下所示
模型的验证
class Todo extends Backbone.Model
validate: (attrs) ->
errs = {}
hasErrors = false
if (attrs.title is "")
hasErrors = true
errs.title = "Please specify a todo"
if hasErrors
return errs
查看
中与错误相关的代码class TodoView extends Backbone.View
events:
"keypress .editing input[name=todo]": "saveTodo"
"keyup .editing input[name=todo]": "closeEdit"
"blur input[name=todo]": "clearErrors"
initialize: ->
...
@model.bind("change", @render)
@model.bind("error", @handleError)
saveTodo: (e) ->
if e.type is "keypress" and e.charCode isnt 13
return
@model.set("title": @$("input[name=todo]").val())
console.log @$("input[name=todo]").val() + "...", @model.isValid(), @model.get("title")
if @model.isValid()
@closeEdit()
closeEdit: (e) ->
if (e)
if e.type is "keyup" and e.keyCode isnt 27 then return
@$el.removeClass("editing")
handleError: (model, errs) ->
@clearErrors()
@$("input[name=todo]").after($("<span />", {
class: "error",
html: errs.title
}));
console.log "error handled"
clearErrors: ->
@$el.remove(".error")
在TodoView.saveTodo
中,我检查模型是否有效,如果是,我希望save
成功,并希望退出编辑编辑模式。但是,isValid
似乎总是true
,可能是因为验证发生了,因此模型没有保存,因此处于有效状态?
更新
上面添加了JS Fiddle的链接。尝试添加待办事项,然后尝试将待办事项留空。请注意,它关闭了编辑模式,尽管在代码中我有:
saveTodo: (e) ->
if e.type is "keypress" and e.charCode isnt 13
return
@model.set("title", @$("input[name=todo]").val())
if @model.isValid() # model appears to be valid here!
@model.save()
@closeEdit()
现在双击进入编辑模式,注意错误是否意味着验证正确完成
答案 0 :(得分:0)
我真的不明白这个问题但是当我读到它时,你有一个模型,你试图保存你刚输入的一些信息。
模型验证方法将在设置模型的值时自动返回错误。
例如:
var TodoModel = Backbone.Model.extend({
defaults: {
title: '',
closed: 'false'
},
validate: function(attr) {
if (attr.title === '') {
console.log("Title expected");
}
}
});
现在,当您创建此对象的新实例时(因此您尚未在模型中保存任何信息),模型isValid将返回false:
var todo = new TodoModel();
console.log(todo.isValid()); //will be false
我不知道你从哪里获得了保存功能。如果您想将数据放入todo模型,您可以这样做:
var todo = new TodoModel();
todo.set({
'title': 'Figure out Backbone JS'
});
console.log(todo.isValid()); //must now return true
当然你也可以设置这些值:
var todo = new TodoModel({
'title': 'still figuring out'
});
console.log(todo.isValid()); //still returns true
所以这是进行验证检查的方法。
答案 1 :(得分:0)
使用与save()
调用相同的方式在Backbone.Model上调用set()
方法,使其成为一个组合的设置/保存调用。通过自定义validate()
方法验证是在save()
上自动完成的,但在使用set()
时则无法验证。
我从未真正使用isValid()
方法,因为Backbone文档建议改为监听invalid
事件并在那里响应验证错误。所有isValid()
都运行您已定义的验证方法(如果有),并返回一个布尔值,如果invalid
方法返回{{1}以外的任何内容,则触发validate()
事件}}
请注意,1.0.0之前的Backbone.Model版本在验证失败时错误地触发了null
事件而不是error
事件。