我有一些jQuery,它使用每个循环来检查在Symfony 3 CRM上的重复表单字段中输入的值。有一个$.post
它将输入的值发送到一个函数,该函数检查数据库中的重复项,如果它是重复项,则会向数组中添加一些内容,否则会添加一个空值以指示它不是重复项。完成这些操作后,它会检查最终数组并将任何错误添加到错误块以显示给用户。每个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;
});
基本上,它首先检查输入的名称是否有效,然后投递过和愚弄检查。问题是,即使它进行了有效性检查(并相应地打印了错误),它似乎忽略了欺骗检查并继续进行,甚至还没有回复第一个响应。
我该如何确定它在完成之前检查并将错误添加到表单中?我试过其他解决方案,包括尝试在jQuery中实现$.when
功能,但我并不真正了解如何使其工作。任何帮助赞赏。
我真的不明白这一点 - checkDogs的含义是什么?如果我写这个,这意味着之后没有别的东西会运行,因为它有回报吗? –
@MichaelEmerson唯一需要在你的'submit'回调中的位是两个调用'checkInputs'和最后一个'$ .when'的块。正如你已经猜测的那样,直到'$ .post'调用全部完成之后,这些数组才可用,'$ .when'调用处理该同步。 – Alnitak
好吧,那很好,但checkDogs(数组)是什么?如果我补充一点,它会在第一个括号之前抛出一个错误,指出“期待换行符或分号”。另外,由于返回,getInputValues永远不会被达到? –