web-dev-qa-db-ja.com

jQueryを使用して、フォーム内の別のフィールドに依存するフィールドをリモートで検証するにはどうすればよいですか?

リモート検証を使用して、電子メールアドレスがデータベースにすでに存在するかどうかを確認するフォームがあります。ただし、このフォームでは、ユーザーは複数の異なる「グループ」から選択でき、各グループには独自の電子メールアドレスのセットがあります(したがって、同じ電子メールが各グループに1回存在する可能性があります)。

グループの選択はフォームのドロップダウンであり、電子メールアドレスはリモート検証の入力フィールドです。いくつか問題があります。まず、リモートルールを次のように設定しました。

remote: {
    url: 'remote_script.php',
    data: {  group_id:  $('select.group_id').val() }
}

ただし、これにより、group_idパラメーターがselectの最初の値に静的に設定されているようです。つまり、selectを変更してから、リモート検証を再度トリガーしても、group_idパラメーターは変更されません。

まず、フォームのselectの値に応じて、このパラメーターを動的にするにはどうすればよいですか?

次に、電子メールアドレスフィールドでリモート検証を手動でトリガーするにはどうすればよいですか? group_id selectが変更された場合、(フィールドの値を変更せずに)電子メールアドレスフィールドでリモート検証を再トリガーしたいと思います。使ってみました

$(selector).validate().element('.email_addr')

ただし、これは標準の検証(必須、電子メール)のみをトリガーし、リモート呼び出しはトリガーしないようです。

23
Kevin Jhangiani

私の質問の2番目の部分の解決策を見つけました:

 $(".email_addr").removeData("previousValue");

リモートリクエストのキャッシュを削除し、.element()を使用してリモートリクエストを再度トリガーできるようにします。

したがって、私のコードは次のとおりです。

$("select.group_id").change(function() {
    $(".email_addr").removeData("previousValue"); //clear cache when changing group
    $("#customer_form").data('validator').element('.email_addr'); //retrigger remote call
    //my validator is stored in .data() on the form
});

解決策はここで見つかりました: 解決策

私の質問の最初の部分は、もともと@JefferyToによって回答されました

実行する必要があるのは、パラメーターの値を単なる値ではなく関数に変更することだけです。ジェフリーの例は、将来のグーグルのために以下にコピーされています。

remote: {
  url: 'remote_script.php',
  data: {
    group_id: function () {
        return $('select.group_id').val();
    }
  }
}
38
Kevin Jhangiani

2番目の例 リモートの場合、関数(検証中に評価)をデータに使用できるように見えるため、

_remote: {
    url: 'remote_script.php',
    data: {
        group_id: function () {
            return $('select.group_id').val();
        }
    }
}
_

動作するはずです。

2番目の質問では、検証ルールをvalidate()に渡してみましたか?

8
Jeffery To