2

如何获得模型的验证错误,特别是在Ext JS 5.0中?在 4.2 版中,我们这样做了:

var rec = Ext.create("ModelName", {...});
var errors = rec.validate();
if (!errors.isValid()) {
    form.markInvalid(errors);
}

但是validate()现在在文档中被标记为已弃用,并且调用它不再返回任何错误消息。我查看了getValidation()5.0 中引入的方法,但它没有返回任何可以传递给表单组件的错误消息,并且没有明确的示例说明如何实现这一点。

4

1 回答 1

4

我总是在表单本身中使用验证器进行配置 - 这样会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 ?所以我在演示中加入了一个自定义验证器:truedefaultValue

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';
    }
});
于 2014-07-13T16:20:36.267 回答