我需要验证一个包含大量输入的表单.并且,如果输入无效,请在表单中以可视方式指示特定属性无效.为此,我需要单独验证每个表单元素.
我有一个模型和一个代表整个表单的视图.现在,当我更新属性时:
this.model.set('name', this.$name.val())
Run Code Online (Sandbox Code Playgroud)
将调用模型上的validate方法.
但是,在该方法中,我正在验证所有属性,因此在设置上述属性时,所有其他属性也会被验证,如果任何一个属性无效,则返回错误.这意味着即使我的"名称"属性有效,我也会收到其他人的错误.
那么,我该如何验证一个属性呢?
我认为不可能通过validate()方法验证一个属性.一种解决方案是不使用validate方法,而是验证'change'事件的每个属性.但是这会产生很多改变处理程序.这是正确的方法吗?我还可以做些什么?
我也认为这表明骨干中存在更大的问题:
无论何时用于
model.set()在模型上设置属性,都会运行验证方法并验证所有属性.这似乎违反直觉,因为您只需要验证单个属性.
Validate用于使模型保持有效状态,除非您传递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
});
Run Code Online (Sandbox Code Playgroud)
或者在设置它们之前逐个验证它们
var M=Backbone.Model.extend({
defaults:{
name:"",
count:0
},
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",function(model,err) {
console.log(err);
});
if (!obj.validate({name:"name"}))
obj.set({name:"name"},{silent:true});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12368 次 |
| 最近记录: |