【问题标题】:Backbone.Model validation and isValidBackbone.Model 验证和 isValid
【发布时间】:2013-08-26 22:09:48
【问题描述】:

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

模型的验证

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

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

【问题讨论】:

  • 抱歉,您有什么问题吗? isValid 总是返回 true?或者save 似乎不起作用?
  • @user1248256,问题似乎是handleError被触发,但在saveTodo@model.isValid返回true,我在想,这可能是由于模型检测为无效因此没有保存.那么当它转到isValid时,它的有效因为模型没有改变?
  • 可能handleError 是由save 方法触发的?嗯,你在哪里调用save方法?
  • 在这个版本中,我错过了保存方法。但我认为即使缺少了,这应该仍然有效吗?我希望isValid 返回 false?
  • > "尝试添加待办事项,然后尝试将待办事项设为空白。注意它会关闭编辑模式"。看来它对我来说是正确的。当我尝试添加空白待办事项时,我看到“请指定待办事项”,编辑模式未关闭且未添加待办事项。

标签: validation backbone.js coffeescript


【解决方案1】:

我不太明白这个问题,但是当我阅读它时,您有一个模型,您可以在其中尝试保存刚刚输入的一些信息。

模型验证方法会在设置模型值时自动返回错误。

例如:

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

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

【讨论】:

    【解决方案2】:

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

    我从未真正使用过isValid() 方法,因为Backbone 文档建议改为监听invalid 事件并响应那里的验证错误。 isValid() 所做的只是运行您定义的验证方法(如果有),并返回一个布尔值,如果您的 validate() 方法返回除 null 以外的任何内容,则触发 invalid 事件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多