升级到ExtJS3.2之后vtype=email或者其他的TextField在allowBlank : true的情况下提示“邮件格式错误”,查看源代码发现:
3.2中代码片段
getErrors: function(value) {
var errors = Ext.form.TextField.superclass.getErrors.apply(this, arguments);
value = value || this.processValue(this.getRawValue());
if(Ext.isFunction(this.validator)){
var msg = this.validator(value);
if (msg !== true) {
errors.push(msg);
}
}
if (!this.allowBlank && (value.length < 1 || value === this.emptyText)) { // if it's blank
errors.push(this.blankText);
}
if (value.length < this.minLength) {
errors.push(String.format(this.minLengthText, this.minLength));
}
if (value.length > this.maxLength) {
errors.push(String.format(this.maxLengthText, this.maxLength));
}
if (this.vtype) {
var vt = Ext.form.VTypes;
alert(vt[this.vtype](value, this));
if(!vt[this.vtype](value, this)){
errors.push(this.vtypeText || vt[this.vtype +'Text']);
}
}
if (this.regex && !this.regex.test(value)) {
errors.push(this.regexText);
}
return errors;
},
对比3.1中代码片段
validateValue : function(value){ if(Ext.isFunction(this.validator)){ var msg = this.validator(value); if(msg !== true){ this.markInvalid(msg); return false; } } if(value.length < 1 || value === this.emptyText){ if(this.allowBlank){ this.clearInvalid(); return true; }else{ this.markInvalid(this.blankText); return false; } } if(value.length < this.minLength){ this.markInvalid(String.format(this.minLengthText, this.minLength)); return false; } if(value.length > this.maxLength){ this.markInvalid(String.format(this.maxLengthText, this.maxLength)); return false; } if(this.vtype){ var vt = Ext.form.VTypes; if(!vt[this.vtype](value, this)){ this.markInvalid(this.vtypeText || vt[this.vtype +'Text']); return false; } } if(this.regex && !this.regex.test(value)){ this.markInvalid(this.regexText); return false; } return true; },
可见3.2中对代码效率和错误处理作了一些调整,不过这个改动也确实太大了一些,不知道是不是考虑到效率对比发现了问题的所在:
//3.2中的代码 显然这里在allowBlank之后并没有返回true而是放任下面的代码继续 貌似这个不符合逻辑
if (!this.allowBlank && (value.length < 1 || value === this.emptyText)) {
errors.push(this.blankText);
}
//3.1中的代码
if(value.length < 1 || value === this.emptyText){
if(this.allowBlank){
this.clearInvalid();
return true;
}else{
this.markInvalid(this.blankText);
return false;
}
}
修复Bug代码:
// 修复ExtJS3.2中TextField allowBlank : true 失效的Bug Ext.override(Ext.form.TextField, { getErrors : function(value) { var errors = Ext.form.TextField.superclass.getErrors.apply(this, arguments); value = value || this.processValue(this.getRawValue()); if (Ext.isFunction(this.validator)) { var msg = this.validator(value); if (msg !== true) { errors.push(msg); } } if (value.length < 1 || value === this.emptyText) { if (this.allowBlank) { this.clearInvalid(); return true; } else { errors.push(this.blankText); } } if (value.length < this.minLength) { errors.push(String.format(this.minLengthText, this.minLength)); } if (value.length > this.maxLength) { errors.push(String.format(this.maxLengthText, this.maxLength)); } if (this.vtype) { var vt = Ext.form.VTypes; if (!vt[this.vtype](value, this)) { errors.push(this.vtypeText || vt[this.vtype + 'Text']); } } if (this.regex && !this.regex.test(value)) { errors.push(this.regexText); } return errors; } });