我需要验证一个表单中的一堆输入.而且,如果输入无效,则以特定属性无效的形式进行目视指示.为此,我需要单独验证每个表单元素.
我有一个模型&一个表示整个表格的视图.现在当我更新一个属性:
this.model.set('name',this.$name.val())
但是,在该方法中,我验证所有属性,因此在设置上述属性时,所有其他属性都将被验证,如果任何一个无效,则返回错误.这意味着即使我的’name’属性有效,我也会收到别人的错误.
那么,如何只验证一个属性?
我认为不可能通过validate()方法验证一个属性.一个解决方案是不使用validate方法,而是在’change’事件上验证每个属性.但这样做会使很多变更处理程序.这是正确的方法吗?我还可以做些什么?
我也认为这是一个更大的问题:
Whenever you use
model.set()
to set an attribute on the model,your validation method is run and all@H_301_21@ attributes are validated. This seems counterintuitive as you just want that single attribute to be validated.
解决方法
验证用于保持模型处于有效状态,除非您传递silent:true选项,否则不允许您设置无效值.
您可以一次性设置所有属性:
var M=Backbone.Model.extend({ defaults:{ name:"",count:0 },validate: function(attrs) { var invalid=[]; if (attrs.name==="") invalid.push("name"); if (attrs.count===0) invalid.push("count"); if (invalid.length>0) return invalid; } }); var obj=new M(); obj.on("error",function(model,err) { console.log(err); }); obj.set({ name:"name",count:1 });
或者在设置它们之前逐个验证它们
var M=Backbone.Model.extend({ defaults:{ name:"",validate: function(attrs) { var invalid=[]; if ( (_.has(attrs,"name"))&&(attrs.name==="") ) invalid.push("name"); if ( (_.has(attrs,"count"))&&(attrs.count===0) ) invalid.push("count"); if (invalid.length>0) return invalid; } }); var obj=new M(); obj.on("error",err) { console.log(err); }); if (!obj.validate({name:"name"})) obj.set({name:"name"},{silent:true});