标记字段无效

时间:2011-08-12 13:36:21

标签: forms extjs

我使用自定义的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;
}
});

1 个答案:

答案 0 :(得分:1)

好吧,如果你看一下clientValidation的定义:

  

确定在最终调用中是否验证表单的字段   在提交之前是isValid。在表单的提交选项中传递false   防止这种情况。如果未定义,则提交前字段验证   进行。

这基本上是说,如果设置为false,那么表单将在提交之前自动验证...如果您将任何字段标记为无效,则该表单将失败。如果您将其设置为true,则需要在提交之前手动检查表单是否有效。

值得指出的是,你的AJAX vtype永远不会起作用。当表单调用vtype来检查字段是否有效时,它所响应的全部是true ...因此表单无论如何都会提交。即使你在ajax请求完成后告诉它返回,表单也会在vtype ajax请求完成之前提交。

更好的解决方案是在提交按钮处理程序中手动调用vtype ...然后在ajax请求的success中执行

if(form.isValid()) {
   form.getForm().submit();
}

这将强制提交按钮的点击事件首先验证用户名字段,然后,只有这样,它才会提交表单。