2013-03-06 16 views
0

這裏是情況。我在phonegap/jquerymobile有一個應用程序。我想根據json數據更改頁面。javascript:json響應正常。與var一起工作是錯誤的

當用戶啓動應用程序,但當前版本不是最新版本時,需要更改內容。這是start.html頁面的一段代碼。

<script type="text/javascript" charset="utf-8"> 
var versionValue = ServerSettings.versionCheck(); 
if(versionValue == true){ 
    $("#loginPage").removeClass("hidden"); 
      $("#updatePage").addClass("hidden");  
} 
else{ 
      $("#loginPage").addClass("hidden"); 
      $("#updatePage").removeClass("hidden"); 
} 
</script> 

函數ServerSettings.versionCheck()如下。

versionCheck : function() { 
     var localAppVersion = 0.8; 
     var response = false; 
     $.ajax({ 
       async: false, 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       url: "http://xxx/service/version.php", 
       success: function(jsonData) { 
        var currentAppVersion = jsonData.version; 
         if(localAppVersion == currentAppVersion){ 
          response = true; 
         } 
         else{ 
          response = false; 
         } 
       }      
     }); 
        return response; 
    } 

我已經驗證了json調用與敬酒的響應。它確實得到了正確的迴應。(版本:0.9)我很確定我做出了最愚蠢的錯誤,但我似乎無法找到它。

+1

所以哪個變量是給不正確的值? – 2013-03-06 16:26:30

+0

ServerSettings.versionCheck()始終未定義。 – Klaas 2013-03-06 16:35:49

回答

0

這是由於您試圖訪問還沒有從服務器爲您的是被退回尚未值使用異步。

你可以重構你的版本檢查,採取像這樣的回調參數。

<script type="text/javascript" charset="utf-8"> 

    var localAppVersion = 0.8, 
     versionValue =false; 
    var versionValue = ServerSettings.versionCheck(function(jsonData){ 

     var currentAppVersion = jsonData.version; 
        if(localAppVersion == currentAppVersion){ 
         versionValue = true; 
        } 
        else{ 
         versionValue = false; 
        } 

     if(versionValue == true){ 
      $("#loginPage").removeClass("hidden"); 
      $("#updatePage").addClass("hidden");  
     }else{ 
      $("#loginPage").addClass("hidden"); 
      $("#updatePage").removeClass("hidden"); 
    } 
    }); 

versionCheck : function(callback) { 
    var localAppVersion = 0.8; 
    var response = false; 
    $.ajax({ 
      async: "false", 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "http://xxx/service/version.php", 
      success: callback     
    }); 
} 
1

您正在嘗試是同步的,但配置參數被評估爲true,因爲它是一個字符串

async: "false" 

將其更改爲async: false,但我建議切換到異步避免阻塞UI。

此外,您的成功回調不會返回到外部方法,所以你總是會得到未定義的。

versionCheck : function() { 
    var localAppVersion = 0.8; 
    var response = false; 
    $.ajax({ 
      // WARNING: I don't recommend setting this to false in production code 
      // While the browser is waiting for the response the page/browser will not respond!! 
      async: false, 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "http://xxx/service/version.php", 
      success: function(jsonData) { 
       var currentAppVersion = jsonData.version; 
       response = localAppVersion == currentAppVersion; 
      }      
    }); 
    return response; 
} 

爲了使異步(推薦的方法

versionCheck : function(checkCompleteCallback) { 
    var localAppVersion = 0.8; 
    $.ajax({ 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "http://xxx/service/version.php", 
      success: function(jsonData) { 
       var currentAppVersion = jsonData.version; 
       checkCompleteCallback(localAppVersion == currentAppVersion); 
      } 
    }); 
} 

// Now the check accepts a callback function that executes when the request completes without blocking the UI 
ServerSettings.versionCheck(function(versionValue) { 
    if(versionValue){ 
     $("#loginPage").removeClass("hidden"); 
     $("#updatePage").addClass("hidden");  
    } 
    else { 
     $("#loginPage").addClass("hidden"); 
     $("#updatePage").removeClass("hidden"); 
    } 
}); 
0

Ajax的異步工作,所以當你做檢查的響應實際上還沒到。將依賴於該值的邏輯放入ajax回調中。

versionCheck : function() { 
    var localAppVersion = 0.8; 
    $.ajax({ 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "http://xxx/service/version.php", 
      success: function(jsonData) { 
       var currentAppVersion = jsonData.version; 

       if(localAppVersion == currentAppVersion){ 
        $("#loginPage").removeClass("hidden"); 
        $("#updatePage").addClass("hidden");  
       } 
       else { 
        $("#loginPage").addClass("hidden"); 
        $("#updatePage").removeClass("hidden"); 
       } 
      }      
     }); 
    } 
+0

你錯過了爲什麼它是異步的,而不是sych。 – epascarello 2013-03-06 16:58:55

0

版本檢查是異步調用。所以,它不會返回真或假。您的versionValue不會是真​​或假。異步調用最好使用promise。

更改versionCheck功能這樣

versionCheck : function() { 
      var localAppVersion = 0.8; 
      var response = false; 
      $.ajax({ 
        async: "false", 
        type: "GET", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        url: "http://xxx/service/version.php", 
        success: function(jsonData) { 
         var currentAppVersion = jsonData.version; 
          if(localAppVersion == currentAppVersion){ 
           return true; 
          } 
          else{ 
           return false; 
          } 
        }      
      }).done(function(){ 
       if(versionValue == true){ 
        $("#loginPage").removeClass("hidden"); 
        $("#updatePage").addClass("hidden");  
       } 
       else{ 
        $("#loginPage").addClass("hidden"); 
        $("#updatePage").removeClass("hidden"); 
       }  
      }); 
     } 

jQuery.promise是版本> 1.6

相關問題