我总是在表单本身中使用验证器进行配置 - 这样会Ext.form.Panel
isValid
根据需要自动标记相关字段。做你想做的事是相当直接的,但是只需进行一些修改——尽管这会返回getValidation
一个私有实用程序类,但可能会使代码容易受到框架未来版本的更改的影响。
首先,Ext.data.Model
getValidation
返回一个实例,Ext.data.Validation
该实例本身就是一个简单的数据模型。它基本上是具有相应有效性的每个字段的键值映射 - 如果一个值是严格的布尔值,那么该字段是有效的true
,其他任何东西,即string
(错误消息),那么该字段是无效的。为方便起见,您可以编写一个函数,以您需要的格式返回错误 - 在本例中,我已经覆盖了验证模型本身,但理想情况下,您可以通过扩展或mixin将逻辑合并到您自己的模型中:
Ext.define('override.data.Validation', {
override: 'Ext.data.Validation',
getErrors: function(){
var errors = [];
Ext.iterate(this.getData(), function(field, value){
if(true !== value) this.push({ id: field, msg: value });
}, errors);
return errors;
}
});
然后修改上面的逻辑如下:
var rec = Ext.create("ModelName", { /***/ });
if(!rec.isValid()){
form.markInvalid( rec.getValidation().getErrors() );
}
» 演示/小提琴
还值得注意的是,如果您以这种方式验证模型,无论您是否设置值,Presence
验证器似乎总是返回(有效) - 大概是因为记录对象原型上存在 a ?所以我在演示中加入了一个自定义验证器:true
defaultValue
Ext.define('validator.NotEmpty', {
extend: 'Ext.data.validator.Validator',
alias: 'data.validator.notempty',
validate: function(value){
return !Ext.isEmpty(value) || 'Field must not be empty';
}
});