Backbone.Model验证和isValid

时间:2012-06-05 10:04:11

标签: validation backbone.js coffeescript

我已经设置了我的模型验证,如下所示

模型的验证

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() 

现在双击进入编辑模式,注意错误是否意味着验证正确完成

2 个答案:

答案 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事件。