2017-06-08 43 views
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。有什麼建議麼?

回答

0

你確定你的其他人被觸發了嗎?如果是,你可能想爲你的全局變量聲明一個對象並訪問它。

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

然後使用全局對象的問題可能是在JS

Global.isValid = false; 
+0

是啊我else語句觸發,但警報(參考isValid)後的作用域訪問。如果我在else語句中發出警告(它首先發出警告(isValid)),然後警告else語句中的警報,但它應該做相反的事情。我在某處讀到,這是因爲jquery沒有按照時間順序做ajax。但我不知道如何解決這個問題。 – Muhammad