Ich habe eine Funktion, für die Navigation zwischen Tabs, und auch ein Formular übermittelt. Die Back-End-Validierung funktioniert genauso wie erwartet, aber ich setze meine globale Variable isValid = false, wenn der Benutzer ungültige Eingaben gemacht hat. Ich überprüfe nur ein Formular für jetzt, folglich die Verwendung von data.isValid.jQuery nicht in der Lage, meine globale Variable zu aktualisieren
Mein JQuery-Code
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;
}
});
Meine Funktion $ (document) .auf ('hide.bs.tab', '.nav-Pillen a', function (e) ist nicht in der Lage zu erkennen, die Veränderung in meinem globalen variablen isValid. das verstehe ich nicht wirklich das Problem hier.
My back-End-Code
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()];
});
E Wird ein Fehler erkannt, sollte der Wert false zurückgegeben werden. Ich möchte die Navigation stoppen, wenn die Validierung nicht korrekt ist. Interessant ist, dass isValid true zurückgibt, auch wenn ich die Fehler anzeigen möchte, aber danach, wenn ich versuche, woanders zu navigieren, gibt es false zurück. Irgendwelche Vorschläge?
Ja meine else-Anweisung ausgelöst werden, aber nach Alarmierung (isValid). Wenn ich etwas in der else-Anweisung (zuerst Warnungen (isValid)) und dann die Warnung innerhalb der else-Anweisung warnen, während es umgekehrt tun sollte. Ich habe irgendwo gelesen, dass es daran liegt, dass jQuery in chronologischer Reihenfolge keinen Ajax macht. Aber ich habe keine Ahnung, wie ich dieses Problem beheben kann. – Muhammad