自定义Flex Validator

如果创建自定义Validator类,一般要继承Validator基类,覆盖基类doValidation() 方法。下面实例我们就来自定义一个简单的中国大陆身份证号码的Validator类。

大家都知道,新身份证号码是由18位数字组成的,其中前六位表示省市县代码,第6~13位表示出生日期。而旧身份证号码是由15位数字组成的,其中前六位表示省市县代码,第6~11位表示出生日期。下面我们来看代码实现。

results = super.doValidation(value);

results数组由ValidationResult对象组成,通过构造ValidationResult对象来定义验证错误代码和验证错误消息等。这一句调用了父类的doValidation() 方法,实现使验证程序生成必填字段的功能。

for (var i:int = 0; i < len; i++)
{
    var c:String = val.charAt(i);
    if (isNaN(parseInt(c)))
    {
        results.push(new ValidationResult(
            true, null, "invalidChar", invalidCharError));
        return results;
    }

}

这个代码块用来验证身份证号码每一位是否为整数。

if (len == 18)
{
    dateStr = val.substr(6, 8);
    if(!DateField.stringToDate(dateStr, "YYYYMMDD"))
    {
        results.push(new ValidationResult(
            true, null, "invalidDate",
            invalidDateError));
        return results;
    }
}

上述代码块用来验证18位身份证号码的出生日期。

else if(len == 15)
{
    dateStr = val.substr(6, 6);
    if(!DateField.stringToDate(dateStr, "YYMMDD"))
    {
        results.push(new ValidationResult(
            true, null, "invalidDate",
            invalidDateError));
        return results;
    }
}

此代码块用来验证15位身份证号码的出生日期。

else
{
    results.push(new ValidationResult(true, null, "digit", digitError));
    return  results;
}

该代码块用来验证添加身份证号码位数不正确时的错误提示信息。

也许有人要问,为什么不直接继承NumberValidator呢?NumberValidator包含了对小数、负数、千分位等的处理,用起来太过了。也许有人要问,为什么不直接了使用RegExpValidator呢?原因在于RegExpValidator无法验证出生日期。

本实例中的IDCardValidator类的很简单,我们可以侦听其它输入表单(如出生地和出生日期)来改进对身份证号码的验证。

点击此处查看该实例的效果,点击此处下载该实例的源码。

发表评论