0
我有一個功能,用於在選項卡之間導航,並提交表單。後端驗證正如預期的那樣工作,但是如果用戶給出無效輸入,我將設置全局變量isValid = false。我現在只驗證一個表單,因此使用data.isValid。jQuery無法更新我的全局變量
我的jQuery代碼
var tabID, relatedTabID, isValid=true;
$('#form').on('submit', function (e) {
var formData = $('#form').serialize();
e.preventDefault();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
type: 'POST',
url: '/roa',
dataType: 'json',
data: {inputs: formData, nextTab: relatedTabID, currentTab: tabID}, //also need to pass in related Tab ID, and also tabID
success: function (data) {
if (data.value===1){
if (data.isValid){//if data is valid, return next view
$('#tabShow').html((data.view));
isValid=true;
}
else{//if it isn't target the div id=erros and replace only error section
isValid=false;
var x=jQuery.parseJSON(data.msg);
var errorString = '';
$.each(x.errors, function(key, value) {
errorString += "<li class='alert alert-danger'>" + value + '</li>';
});
alert(errorString);
$('.something').html(errorString);
return false;//prevent navigation
}
}
else{
$('#tabShow').html((data.view));}
},
error: function() {
alert('error');
}
});
});
$(document).on('hide.bs.tab', '.nav-pills a', function (e) {
tabID = $(e.target).attr('id');
relatedTabID = $(e.relatedTarget).attr('id');
$('#form').submit();
alert(isValid);
if (tabID==='section2'){
return false;
}
});
我的函數的$(document)。在( 'hide.bs.tab', '.nav-丸',函數(e)是無法檢測在我的全局變量的isValid的變化。我真的不明白這裏的問題。
我的後端代碼
Route::post('/roa', function() {
$m = Request::except('_token');
$name = "form1_sections/" . $m['nextTab'] . "_form";//next view name
$name2 = "form1_sections/" . $m['currentTab'] . "_form";//current view name
parse_str($m['inputs'], $output);
$type= gettype($output);
if ($m['currentTab']=='section2'){//only validation for section2
$rules = [
'TB1_course.*' => 'required'
];
$validator=Validator::make($output, $rules);
if ($validator->passes()){
return ["view" => view("$name")-> render(), "value"=>1, "type"=>$type, "isValid"=>true];
}
return ["view" => view("$name2")->withErrors($validator) -> render(), "value"=>1, "type"=>$type, "isValid"=>false, "msg"=>json_encode([
'errors' => $validator->errors()->getMessages(),
'code' => 422
])];
}
return ["view" => view("$name") -> render()];
});
Ë當檢測到錯誤時,它應該返回false值。如果驗證不正確,我想停止導航。有意思的是,isValid返回true,即使當我顯示錯誤,但在此之後,如果我嘗試在其他地方導航,它將返回false。有什麼建議麼?
是啊我else語句觸發,但警報(參考isValid)後的作用域訪問。如果我在else語句中發出警告(它首先發出警告(isValid)),然後警告else語句中的警報,但它應該做相反的事情。我在某處讀到,這是因爲jquery沒有按照時間順序做ajax。但我不知道如何解決這個問題。 – Muhammad