Backbone验证不起作用

use*_*553 22 javascript backbone.js

我使用Backbone的validate函数来保证Man有一个age超过18 的属性.这是我的代码:

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("error",function(model,error){
            alert(error);
        });
    },
    validate : function(attrs,options){
        if (attrs.age < 18){
            return 'below 18';
        } 
    }
})

var man = new Man({name : 'qian', age : 12});
Run Code Online (Sandbox Code Playgroud)

但看看结果似乎validate不起作用.

Tom*_*Tom 42

在Backbone.js(版本之前0.9.10)中,validate之前save和之前都会调用它set.

设置无效值时,您将收到警告错误.

示例 - age值低于18:

var man = new Man ({name : 'qian', age : 12});
man.set({ age: 12 }); // that will trigger alert
Run Code Online (Sandbox Code Playgroud)

编辑

对于Backbone.js版本0.9.10+,报告了一个问题:失败的验证不会触发错误回调.问题解释说

invalid 应该使用事件而不是 error

所以将代码更改为:

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("invalid",function(model,error){
            alert(error);
        });
    },
    ...
Run Code Online (Sandbox Code Playgroud)

设置为validate选项的设置变量true将触发一个alert.

man.set({age: 12}, {validate : true});
Run Code Online (Sandbox Code Playgroud)

  • 所以你现在必须明确告诉骨干来验证?看起来有点太烂了!! (3认同)
  • 你知道了!0.9.10,那我该怎么办呢 (2认同)
  • Yowch.不喜欢选项要求!! https://github.com/documentcloud/backbone/issues/2174 (2认同)

yes*_*nik 8

对于主干v.1.0.0

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("invalid",function(model,error){
            alert(error);
        });
    },
    validate : function(attrs, options){
        if (attrs.age < 18){
            return 'below 18';
        } 
    }
});
Run Code Online (Sandbox Code Playgroud)

示例1.没有{validate:true}

//Object will be created with invalid attribute 'age' 
var man = new Man({name : 'qian', age : 12});
console.log(man) // Returns an object with invalid attributes

// But we'll use only valid objects.
// Also we'll get the error message in alert, if validation fails.
if(man.isValid()){
    alert( man.get('name') );
}

var man = new Man({name : 'qian', age : 19});
if(man.isValid()){
    alert( man.get('name') );
}
Run Code Online (Sandbox Code Playgroud)

示例2.使用{validate:true}

//Object will be created without any passed attributes
var man = new Man({name : 'qian', age : 12}, {validate:true});
console.log(man) //Object will be without passed attributes

/* man.isValid() returns 'true' throw we passed invalid attrs.
   We won't see any error alert message, because Backbone created empty object */
/* Doesn't work */
if(man.isValid()){
    alert( man.get('name') ); //undefined
}
/* Works */
// Created model had invalid attrs, so validationError won't be empty.
// If all attrs are valid, validationError will be empty
if(!man.validationError){
    alert( man.get('name') );
}
Run Code Online (Sandbox Code Playgroud)