私は、各ループを使用してSymfony 3 CRMの繰り返しフォームフィールドに入力された値を調べるjQueryをいくつか持っています。 $.post
は、入力された値をデータベース内の重複をチェックする関数に送信し、重複している場合は配列に何かを追加します。そうでなければ空白の値を追加して重複ではないことを示します。これらの操作が完了すると、最後の配列をチェックし、エラーブロックにエラーを追加してユーザーに表示します。それぞれがajaxを呼び出しているjQueryは終了前に続きます
しかし、配列は常に空白で、実際に応答を取得する前にエラーを表示するコードが実行されていると思います。ここで
は私のコードです:
$('#puppy_form').on('submit', function() {
var bitch_errors = [];
var dog_errors = [];
// NOTE: Bitch and dog names need to be checked differently so we know which error is assigned to which input
$('.check_bitch_name').each(function(i, obj) {
// need to check each name for validity and duplication.
var entered_bitch_name = obj.value;
var pattern = /^[a-zA-Z,.]+\s[a-zA-Z,.]+(\s[a-zA-Z,.]+){0,}$/;
if(!pattern.test(entered_bitch_name)) {
bitch_errors[i+1] = "invalid";
} else {
// now to check for duplicates
$.post('/check-puppy-name', { name: entered_bitch_name }
).done(function (response) {
if(response == 'duplicate') {
bitch_errors[i+1] = "duplicate";
} else {
bitch_errors[i+1] = "";
}
});
}
});
$('.check_dog_name').each(function(i, obj) {
// need to check each name for validity and duplication.
var entered_dog_name = obj.value;
var pattern = /^[a-zA-Z,.]+\s[a-zA-Z,.]+(\s[a-zA-Z,.]+){0,}$/;
if(!pattern.test(entered_dog_name)) {
dog_errors[i+1] = "invalid";
} else {
// now to check for duplicates
$.post('/check-puppy-name', { name: entered_dog_name }
).done(function (response) {
if(response == 'duplicate') {
dog_errors[i+1] = "duplicate";
} else {
dog_errors[i+1] = "";
}
});
}
});
if(count(bitch_errors) == 0 && count(dog_errors) == 0) {
return true;
}
// loop through the errors and assign them to the correct input
$.each(bitch_errors, function(key, value) {
if (value == "invalid") {
$('input[name="bitch_name['+key+']"]').parent().addClass('has-error');
$('input[name="bitch_name['+key+']"]').next('.error-message').html('Names must be at least two words, and only contain letters');
return false;
} else if(value == "duplicate") {
$('input[name="bitch_name['+key+']"]').parent().addClass('has-error');
$('input[name="bitch_name['+key+']"]').next('.error-message').html('Sorry, this name has already been taken');
return false;
}
});
$.each(dog_errors, function(key, value) {
if(value != "") {
if (value == "invalid") {
$('input[name="dog_name['+key+']"]').parent().addClass('has-error');
$('input[name="dog_name['+key+']"]').next('.error-message').html('Names must be at least two words, and only contain letters');
return false;
} else if(value == "duplicate") {
$('input[name="dog_name['+key+']"]').parent().addClass('has-error');
$('input[name="dog_name['+key+']"]').next('.error-message').html('Sorry, this name has already been taken');
return false;
}
}
});
return false;
});
基本的には、入力した名前が有効であること、それを最初にチェックし、オフの投稿やdupesをチェック。問題は、妥当性検査を行い(それに応じてエラーを出力する)、括りチェックを無視し、最初の応答を返す前に実行するように見えることです。
エラーをフォームに追加して追加する前に、確認が完了していることを確認するにはどうすればよいですか?私は$.when
の機能をjQueryに実装しようと試みることを含め、他の解決策を試しましたが、実際に動作させる方法を理解していません。どんな助けもありがたい。
私は本当にこれを理解していない - checkDogsは何を意味するのですか?私がこれを書いたら、それは帰りを得て以来何も実行していないことを意味するでしょうか? –
@MichaelEmersonあなたの 'submit'コールバック内にある必要がある唯一のビットは' checkInputs'への2回の呼び出しと '$ .when'での最後のブロックです。すでに推測したように、 '$ .post'呼び出しがすべて終了し、' $ .when'呼び出しがその同期を処理するまで、配列は利用できません。 – Alnitak
OKですが、checkDogs(配列)とは何ですか?それを追加すると、最初の括弧の直前に「改行またはセミコロンが必要です」というエラーがスローされます。また、リターンのために、getInputValuesには決して達しませんか? –