如果创建自定义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类的很简单,我们可以侦听其它输入表单(如出生地和出生日期)来改进对身份证号码的验证。