2011-08-12 14 views
3

私はカスタムAJAX vtypeを使用しています。 私はExtJSのドキュメントは、「フィールドを無効にする

ことに注意注意気づくしかし:このメソッドは値が検証に合格しない場合、フィールドの検証やのisValidメソッドがfalseを返すことはありませんので、単に無効なフィールドをマーキングすると、フォームの提出を防ぐことはできませんが。 Ext.form.action.Submit.clientValidationオプションが設定された状態で送信されます。

form.isValid()がfalseを返すようにフィールドを無効としてマークするにはどうすればよいですか? マイVTYPE:あなたはclientValidationの定義を見れば

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

まあ、:

は、フォームのフィールドは、提出前に のisValidに、最終的な呼び出しで検証されているかどうかを決定します。これを防ぐには、フォームの送信オプション にfalseを渡します。定義されていない場合、提出前フィールド検証は が実行されます。

フォームが自動的提出前に検証されます、その後falseへのセットならば...あなたは無効として、任意のフィールドをマークしている場合、それは失敗します、その時点でこれは基本的に、と言っています。 trueに設定した場合は、送信する前にフォームが有効かどうかを手動で確認する必要があります。

あなたのAJAX vtypeは決して動かないことを指摘しておきましょう。フォームがフィールドが有効かどうかをチェックするためにvtypeを呼び出すと、それに応答して取得されるのはすべてtrue ...なのでフォームは何に関係なく送信されます。 ajaxリクエストが完了した後に返すように指示しても、フォームはvtype ajaxリクエストが完了する前に送信されます。

より良い解決策は、これは、送信ボタンのクリックイベントを強制するだけで

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

を行うAJAXリクエストのごsuccessで、その後...手動で送信ボタンハンドラにVTYPEへの呼び出しを含めることであろう最初にユーザー名フィールドを検証してからフォームを送信します。

+0

このようなフォームを送信すると、非同期が中断されます。私はフォームの手動検証を避けることを好むでしょう、理論的には、vtypeチェックを乗り越えて、isValid = false;を設定する関数を持つ方がはるかに簡単でしょう。 – Alex

+0

ajax成功呼び出しに縛られることはできませんフォームの検証はtrueを返し、フォームはajaxリクエストが完了する前に送信されます。あなたは 'submit()'メソッドをオーバーライドする必要があります。 ajaxリクエストを手動で実行し、引数としてコールバック関数を使用するよう強制します。 – JamesHalsall

関連する問題