无法访问angularjs中http响应回调函数之外的$ scope对象

时间:2015-12-31 09:49:56

标签: javascript angularjs angularjs-scope

我有这个控制器用于保存个人的一些细节。我有一个单独的存储库EntityRepository,其中定义了一个从数据库中获取用户性别的函数。

函数响应正常工作,当我在函数响应中的控制台上打印性别时,它可以工作(console.log(" inside:",$ scope.userGender);)。

但是在函数之外,我没有得到值(console.log(" outside:",$ scope.userGender);)

.controller('individualDetailsCtrl', function($scope, $rootScope, $location, EntityRepository) {
 $scope.userGender = "";
 $scope.entity = {
   name: "",
   gender: $scope.userGender,
   dob: "",
   pan: ""
 };
 EntityRepository.getUserGender()
 .then(function(response){
   $scope.userGender = response.data.gender;
   console.log("inside : ", $scope.userGender);
 })
 .catch(function(errorResponse) {
   $scope.error = errorResponse.data
 });
 console.log("outside : ", $scope.userGender);
});

我想在$ scope.entity.gender中保存响应中的性别,但我无法在函数范围之外访问$ scope.userGender的值。

由于$ scope是在控制器的范围内定义的,我认为它应该能够在函数响应之外访问它的值。

3 个答案:

答案 0 :(得分:1)

您无法在AJAX成功回调之外访问<table id="table" class="table"> <tr> <th>Messages</th> <th>Problem Description</th> <th>Doctor's Answer</th> <th></th> </tr> <tr> <th><select id="title"> <?php $sql="select title from messages where paitient_id=(select id from login where username='".$username."');"; $result=mysqli_query($conn,$sql); while($row=mysqli_fetch_array($result)) { ?> <?php echo "<option value=\"mesazhi1\">".$row[0]."</option>";}?> </select> </th> <td><textarea rows="17.95" col="100" id ="question" > </textarea></td> <td><textarea rows="17.95" col="100" id ="answer" readonly> </textarea></td> </tr> <tr> <td></td> </tr> <tr> <td><input type="button" name="openmessage" value="Display Selected Message" onClick="process()"></td> </tr> </table> </form> 的值的原因很简单:AJAX是异步的,这意味着只有在此AJAX调用成功后才会分配此变量的值。您应该调整代码,使其在此AJAX调用成功之前不依赖于$scope.userGender的值。如果此值是绑定到标记中某个控件的数据,那么这不是问题,当从服务器检索值时,该值将显示一点延迟。

答案 1 :(得分:0)

由于请求的异步属性,您无法访问外部值。这只是意味着这句话:console.log("outside : ", $scope.userGender);,正在.then(function(){ ... })之前执行。

修正:

  1. 将您的外部代码包含在$timeout
  2. .controller('individualDetailsCtrl', function($scope, $rootScope, $location, EntityRepository, $timeout) {

    $timeout(function() {console.log("outside : ", $scope.userGender)});

    1. 仅在$scope.userGender
    2. 中使用.then(function() { })的值

答案 2 :(得分:0)

你能试试吗?

  $scope.GetUserGender = function(){
 EntityRepository.getUserGender().then(function(response){
    $scope.userGender = response.data.gender;
    console.log("inside : ", $scope.userGender);
  }).catch(function(errorResponse) {
    $scope.error = errorResponse.data
  });     
}
  $scope.GetUserGender();   //

 console.log("outside : ", $scope.userGender);

希望这会奏效:)