我使用自定义的AJAX vtype,它可以正常运行。 但是我注意到extjs文档注意到
“注意:如果值通过验证,则此方法不会导致Field的validate或isValid方法返回false。因此,仅将Field标记为无效将不会阻止提交使用Ext.form.action.Submit提交的表单.clientValidation选项设置。“
如何将字段标记为无效,以便form.isValid()返回false? 我的vtype:
Ext.apply(Ext.form.VTypes, {
username: function(value, field){
var conn = new Ext.data.Connection();
conn.request({
url: 'test.php',
params:{email:value},
method: 'POST',
success: function(responseObject){
var resp = responseObject.responseText;
if (resp == 0) {
field.markInvalid('This email is invalid or already registered!');
} else if (resp == 1) {
field.clearInvalid();
}
},
failure: function(){
Ext.Msg.show({title: 'Error', msg: 'Connection error!',});
}
});
return true;
}
});
答案 0 :(得分:1)
好吧,如果你看一下clientValidation
的定义:
确定在最终调用中是否验证表单的字段 在提交之前是isValid。在表单的提交选项中传递false 防止这种情况。如果未定义,则提交前字段验证 进行。
这基本上是说,如果设置为false
,那么表单将在提交之前自动验证...如果您将任何字段标记为无效,则该表单将失败。如果您将其设置为true
,则需要在提交之前手动检查表单是否有效。
值得指出的是,你的AJAX vtype永远不会起作用。当表单调用vtype来检查字段是否有效时,它所响应的全部是true
...因此表单无论如何都会提交。即使你在ajax请求完成后告诉它返回,表单也会在vtype ajax请求完成之前提交。
更好的解决方案是在提交按钮处理程序中手动调用vtype ...然后在ajax请求的success
中执行
if(form.isValid()) {
form.getForm().submit();
}
这将强制提交按钮的点击事件首先验证用户名字段,然后,只有这样,它才会提交表单。