2017-06-08 3 views
0

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?

Antwort

0

Sind Sie sicher, dass Ihr anderer Auslöser war? Wenn ja, möchten Sie vielleicht dies für Ihre globalen Variablen tun, deklarieren Sie ein Objekt und greifen Sie darauf zu.

ex

var Global = { 
    isValid = true 
///put all your Global variable here 
} 

es dann die global Ihr Problem mit Zugriff auf dem Objekt könnte der Scoping in js

Global.isValid = false; 
+0

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

Verwandte Themen