0

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

模型验证

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

View中的错误相关代码

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

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

4

2 回答 2

0

save()以与调用相同的方式使用数据调用 Backbone.Model 上的方法set()使其成为组合的设置/保存调用。通过您的自定义validate()方法进行的验证在 上自动完成save(),但在使用时不会set()

我从未真正使用过该isValid()方法,因为 Backbone 文档建议改为侦听invalid事件并响应那里的验证错误。所做的只是运行您定义的验证方法(如果有isValid()),并返回一个布尔值,invalid如果您的validate()方法返回的不是null.

请注意,1.0.0 之前的 Backbone.Model 版本在验证失败时会错误地触发error事件而不是事件。invalid

于 2013-08-26T14:09:48.407 回答
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

所以这是进行验证检查的方法。

于 2013-08-26T13:32:22.737 回答