2011-08-12 26 views
3

我使用自定義AJAX vtype,它工作和所有。 不過,我注意到ExtJS的文檔注意標記一個字段無效

「注意:此方法不會使現場的驗證或參考isValid方法如果此值不通過驗證返回false那麼簡單的標記字段爲無效不會阻止提交的表格使用Ext.form.action.Submit.clientValidation選項集進行提交。「

如何將一個字段標記爲無效,以便form.isValid()返回false? 我的V型:

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

好吧,如果你看看clientValidation定義:

確定窗體的字段是否在最後調用驗證,以 的isValid之前提交。在表單的提交選項 中傳遞錯誤以防止發生此情況。如果未定義,則提交前的字段驗證爲 。

這基本上是說,如果其設置爲false那麼形式將被自動驗證之前在提交......此時,如果你有任何標記字段爲無效就會失敗。如果您將其設置爲true,則需要在提交之前手動檢查表單是否有效。

值得指出的是,你的AJAX vtype是永遠不會工作。當表單調用vtype來檢查字段是否有效時,所有得到的響應是true ...所以無論如何表單都會提交。即使您告訴它在ajax請求完成後返回,表單也會在vtype ajax請求完成之前提交。

一個更好的解決辦法是包括調用V型在你的提交按鈕的處理程序手動...然後在您的Ajax請求的success只是做

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

這將迫使提交按鈕的點擊事件首先驗證用戶名字段,然後才能提交表單。

+0

提交表單就會打破異步。 :(我寧願避免手動驗證表單,理論上會更容易擁有一個函數,而不是通過vtype檢查,設置isValid = false;不知何故。 – Alex

+0

如果沒有綁定到ajax成功調用,因爲它本質上是異步的......表單驗證返回true,並且在ajax請求完成之前提交表單,你必須重寫'submit()'方法,也許強制它檢查所有類型並且激發ajax手動請求,並強制它將回調函數作爲參數。 – JamesHalsall