2016-12-31 52 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

但我在这里问这个事件背后的原因 –

相关问题