backbone.js模型验证isValid()为无效属性返回true

时间:2014-04-05 09:30:16

标签: validation backbone.js underscore.js backbone-events

我试图使用isValid方法检查各个属性的有效性。它返回 true 表示无效的属性。我的代码如下:

person = Backbone.Model.extend({
    defaults:{
        name:"default name",
        age:0
    },

    initialize:function(){  
        this.on("invalid",function(model,errors){
            console.log(JSON.stringify(errors));
        });
    },

    validate:function(attrs){
        errors=[];
        if(attrs.age<0){
            errors.push({attribName:"age",errorMsg:"age should be grater than 0"});
        }
        return errors.length>0?errors:false;
    }
});

var person1 = new person();
person1.set({
    age:-5
});

console.log("checking validity of model:"+person1.isValid());   
console.log("checking for validity of age attribute:"+person1.isValid('age'));  

isValid()如果用于检查整个模型的有效性并返回false,则可以正常工作。但是,当我尝试检查 age 属性,即isValid('age')时,如果它应返回 false ,则返回 true

isValid()是一个underscore.js函数,对吗?它是否支持传递属性来检查其有效性?我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

短版

Model.isValid不接受属性名称作为参数,必须在整个模型上使用。如果你不这样做,你就处于无证领域,你会得到奇怪的行为。

要检查个别属性,您必须设置自己的机制。

长版本,为什么你得到一个不同的值

Model.isValid实际上接受一个(未记录的)选项哈希作为其第一个参数,并且它通过

在内部将此哈希转发到Model._validate
this._validate({}, _.extend(options || {}, { validate: true }))

尝试将validate属性设置为true。但此时,options是一个字符串,不会被_.extend修改。 _validate看起来像

_validate: function(attrs, options) {
  if (!options.validate || !this.validate) return true;
  // ...
}

检查是否确实必须验证模型,options.validate 未定义并且您的isValid调用返回真值。

答案 1 :(得分:0)

isValid是骨干API:http://backbonejs.org/#Model-isValid

它返回true的原因是,isValid接受的参数是一个选项参数。它必须是一个对象。

您使用选项的一个方案是:

validate: function(attrs, options) {
  if(options.someSpecialCheck) {
    // Perform some special checks here
  } else {
    // Perform some regular checks here
  }
}

myModel.isValid({someSpecialCheck: true});