2016-12-31 55 views
0

我正在處理一個項目,其中有一個頁面有一個名爲balance的輸入字段,並且包含這個字段的div是balanceDiv.for admin這個字段不會show.so我使用ng-顯示隱藏/顯示div,在角度控制器中編寫函數(一個用於收集loginId,另一個用於隱藏或根據登錄ID顯示div)。顯示或隱藏div的條件是---如果admin found(id 1)DIV將隱藏否則DIV將show.To做,我通知,要求ajax--執行切換到第二功能。在的時候,我的角度controller--當ajax調用時執行另一個函數的原因

 init(); 
     function init() 
     { 
      setLoginId(); 
      showHide(); 
      initilize(); 
     } 

你可以看到,首先它會執行setLoginId然後它會去showHide(如我所料) unctions ---

function setLoginId() 
    { 
     var apiRoute = baseUrl + '/api/AmountDists/GetLoginId/'; 
     var result = CrudService.getAll(apiRoute); 
     result.then(function (response) { 
      debugger 
      $scope.loginId = response.data; 


     }, 
     function (error) { 
      console.log("Error: " + error); 
     }); 
    } 
    function showHide() { 
     if ($scope.loginId == 1) { 
      $scope.balanceDiv = false; 
     } 
     else { 
      $scope.balanceDiv = true; 
     } 
    } 

我所注意到的是,它在執行後,在setLoginId方法Ajax調用時沒有得到響應(或completting的方法),它也適用於顯示隱藏method.After完成顯示隱藏方法,它再次在setLoginId方法中返回。然後執行方法指令的其餘部分。結果是,我在showHide方法中獲取了$ scope.loginId的未定義值。

我想知道爲什麼會發生這種情況?爲什麼執行切換到另一個方法時,Ajax調用?

+1

答案很簡單,AJAX是異步的。考慮一個基本的例子,你在移動2G或壞3G上瀏覽頁面,如果我們做同步處理,用戶將不得不等待響應,頁面將凍結,直到它。你想要那種行爲嗎? – Rajesh

+2

可能的重複[異步在Ajax中意味着什麼?](http://stackoverflow.com/questions/3393751/what-does-asynchronous-means-in-ajax) – Rajesh

回答

1

功能需要

init(); 
    function init() 
    { 
     setLoginId().then(function(data) { 
      showHide(data); 
     }).then(function() { 
      initilize(); 
     }); 
    } 

一定要歸還承諾的鏈接:

function setLoginId() 
{ 
    var apiRoute = baseUrl + '/api/AmountDists/GetLoginId/'; 
    var promise = CrudService.getAll(apiRoute); 
    return promise.then(function (response) { 
    //^^^^^^ return derived promise 
     debugger 
     $scope.loginId = response.data; 
     //RETURN data to chain 
     return response.data; 
    }, 
    function (error) { 
     console.log("Error: " + error); 
    }); 
} 

添加數據參數:

function showHide(loginID) { 
    if (loginID == 1) { 
     $scope.balanceDiv = false; 
    } 
    else { 
     $scope.balanceDiv = true; 
    } 
} 

通過返回承諾,並使用.then方法,第二個函數的執行被延遲,直到第一個XHR完成。


我想知道原因

重要的是要認識到,$http服務立即返回一個逝去的諾言和並行作出了asynchronous xmlHttpRequest (XHR) 。當結果從服務器返回時,承諾稍後將實現(解決或拒絕)。

立即執行異步API調用後的代碼。如果需要延遲代碼直到完成XHR,則需要將代碼作爲承諾的方法的函數提供。

欲瞭解更多信息,請參見:

+0

我想知道沒有如何解決這個問題的原因 –

+0

您是否認真表示不想解決您的問題? – georgeawg

+0

但我在這裏問這個事件背後的原因 –

相關問題