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



>我试图使用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()是下划线.js函数,对吧?它不支持传递属性来检查其有效性吗?我在这里错过了什么?

简短版本

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调用将返回一个 true 值。

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});