22

我正在使用 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});

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

4

4 回答 4

42

在 Backbone.js(在 version 之前0.9.10)中,在 before和 before 中validate都被调用。saveset

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

示例 -age值低于 18

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

编辑

对于 Backbone.js 版本0.9.10+,报告了一个问题:Failed validation does not trigger error callback。问题解释说

invalid应该使用事件而不是error

因此,将您的代码更改为:

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

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

man.set({age: 12}, {validate : true});
于 2013-01-20T16:00:04.843 回答
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';
        } 
    }
});

示例 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') );
}

示例 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') );
}
于 2013-08-20T06:31:27.593 回答
4

如果您正在使用新版本(> 1.0)的 Backbone 并希望在model.set方法时触发验证,

那么你必须通过{validate: true}火灾验证。

采用

model.set({field:value},{validate: true})

或者

model.set("field","value",{validate: true})

代替

model.set({field:value})

REF:主干更改日志

于 2013-08-09T11:09:11.237 回答
3
var man = new Man({name : 'qian', age : 12}, {validate : true});

编辑:

validate 方法仅在您使用validate参数传递选项对象的情况下才有效(从 0.9.9 版本开始): https ://github.com/documentcloud/backbone/blob/master/backbone.js#L539

它触发的不是error事件而是invalid事件

于 2013-01-20T16:13:03.520 回答