Шаги мастера jQuery перемещаются перед завершением вызова ajax
Как я могу контролировать переход на следующий шаг в соответствии с результатом какого-либо вызова ajax?
data.d возвращает значение bool
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
var move = false;
if (currentIndex == 2) {
move = false;
$.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
success: function (data) {
move = data.d;
return true;
},
error: ajaxLoadError
});
}
return move;
},
saveState: true
});
Ответы
Ответ 1
$.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
async: false,
contentType: "application/json",
dataType: 'json',
success: function (data) {
move = data.d;
return true;
},
error: ajaxLoadError
});
Ответ 2
Если вы не хотите, чтобы функция $.ajax() возвращалась немедленно, установите для параметра async значение false:
Установите Timeout для Ajax, если сервер не отвечает на ваш вызов ajax, тогда он перейдет к следующему процессу.
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
var move = false;
if (currentIndex == 2) {
move = false;
$.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
async: false,
cache: false,
timeout: 30000,
success: function (data) {
move = data.d;
return true;
},
error: ajaxLoadError
});
}
return move;
},
saveState: true
});
Ответ 3
вы можете использовать подход Samy с синхронным запросом ajax
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
if (currentIndex == 2) {
var requestResult = $.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
async: false,
contentType: "application/json",
dataType: 'json',
error: ajaxLoadError
});
return requestResult.responseJSON.Result == "/*your expected value*/"
}
},
saveState: true
});
Ответ 4
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
var $out= false;
if (currentIndex == 2) {
$out= false;
$.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
success: function (data) {
move = data.d;
$out = true;
},
error: ajaxLoadError
});
}
return $out;
},
saveState: true
});
Поместите глобальную переменную $out!
Ответ 5
У меня такая же проблема, я даже думал использовать "setStep" для принудительного выполнения шагов после загрузки ajax, затем последняя версия jquery.steps вытащила "setStep"..
В конечном итоге я использую "следующий" метод и должен использовать глобальный триггер, чтобы остановить бесконечный цикл для события onChanging, короче говоря, я заставляю мастера перейти к следующему шагу, если ajax возвращает действительные данные, в противном случае, он остается на текущем шаге, здесь код
var $stopChanging = false;
.... ....
onStepChanging: function (event, currentIndex, newIndex) {
if ($stopChanging) {
return true;
} else {
items = $.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
success: function (data) {
$stopChanging = true;
wizard.steps("next");
},
error: ajaxLoadError
});
},
onContentLoaded: function (event, currentIndex) {
$stopChanging = false;
}
}
Логика выглядит так:
- Нажмите кнопку "Далее", чтобы запустить onStepChanging
- По умолчанию, значение jquery.steps onStepChanging возвращает false, а затем вызовы $.ajax, если он возвращает действительные данные (успех), вызовите jquery.steps для
перейдите к следующему шагу, и триггеры onStepChanging снова, если это не
действителен, ничего не делать, оставаться на текущем шаге.
запускать два события onStepChanging каждый раз не кажется хорошей идеей, но то, что я могу иметь сейчас
Вам может потребоваться добавить дополнительные условия для разных действий с указателями шагов
Ответ 6
Здесь единственный способ, которым я мог бы работать после нескольких попыток, это то, что @joe-lu получало выше. Вы просто хотите запустить асинхронный вызов и вернуть false. Это позволит сохранить мастер на том же шаге. Затем в обработчике успеха вы программно переходите к следующему шагу.
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
if (currentIndex == 2) {
//Would be a good idea to start a spinner here!
//would be a good idea to disable next button here!
$.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
success: function (data) {
//stop spinner here!
//programmatically move to next step on success.
$("#wizard").steps("next");
},
error: ajaxLoadError
});
}
//Prevents natural movement to next step.
//will be done programmatically
return false;
},
saveState: true
});
Ответ 7
Я столкнулся с аналогичной проблемой, но я использовал parsleyjs для проверки. Вы можете получить представление о моем коде.
Мой код выглядит так:
onStepChanging: function (event, currentIndex, newIndex) {
// ======== Code that fails
//var step = $wizard_advanced.find('.body.current').attr('data-step'),
//$current_step = $('.body[data-step=\"'+ step +'\"]');
// check input fields for errors
//$current_step.find('[data-parsley-id]').each(function() {
//this adds .md-input-danger to inputs if invalid
//there is remote validation occurring here via ajax
// async: false
//$(this).parsley().validate();
//});
// this is executed before ajax validation is finished
//return $current_step.find('.md-input-danger').length ? false : true;
// ======== END of Code that fails
// FIX
// waits on ajax validation to finish before returning
if( $wizard_advanced_form.parsley().validate() ) {
return true;
} else {
return false;
}
//FIX
}
Ответ 8
var items;
$("#wizard").steps({
onStepChanging: function (event, currentIndex, newIndex) {
var move = false;
if (currentIndex == 2) {
move = false;
items = $.ajax({
type: 'POST',
url: "Reservation.aspx/SomeFunction",
data: serializeData({ }),
contentType: "application/json",
dataType: 'json',
success: function (data) {
move = data.d;
return true;
},
error: ajaxLoadError
});
}
return move;
},
saveState: true
});
items.success(function (data) {
//if can log in go to logged in page
if (data.success == true) {
alert("Working");
var move = data.d;
return true;
} else {
alert("didnt work");
}
// output of data
alert(JSON.stringify(data));
});