为什么$ http调用中没有提取数据,总是在其外部显示/使用?

时间:2015-10-07 23:06:42

标签: javascript angularjs http data-binding angular-digest

我有时甚至非常随机地无法使用$ http调用中收到的数据。这样接收的数据将绑定到接收它的变量,但不会转移到另一个变量。例如,下面{{avariable}}显示在HTML页面中(它停止为空并显示来自服务器的数据)但{{anumber}}不会从0更改为新数据(即使我执行$ scope) .anumber = $ scope.avariable)。有时这个问题是通过在$ http调用本身中分配相等而不是稍后来解决的,但这次它也没有那样工作。我想这与消化,eval周期有关吗?我不一定了解它们或它们如何在这种情况下工作。但是,我确实在必要时使用$ timeout。

一切正在Rails /后端方面工作 - 我通过直接访问浏览器中的URL进行检查。当然,如前所述,{{avariable}}确实从null更改为服务器数据。

AngularJS代码:

myangularmodule.controller('appcontroller', function($rootScope, $scope, $filter, $location, $state, $timeout, $http) {

$scope.avariable = null;

$scope.anumber = 0;


$scope.ihappenwhenthatbuttonispressed {

$timeout(function(){
 $http.get('/employees/getthisdata/' + value + '.json').success(function (data) {

        $scope.avariable = data.avariable;

    });
}, 5);

         $scope.anumber = $scope.avariable;



};


});

我的HTML页面:

<html>
<head>
 <%= stylesheet_link_tag "application" %>
 <%= javascript_include_tag "application" %>
</head>

 <body ng-app="myangularmodule">
  <div ng-controller="appcontroller">

    <button ng-click="ihappenwhenthatbuttonispressed(anumber)">
         Click me
   </button>

     {{avariable}}
     {{anumber}}

 </div>
 </body>
</html>

2 个答案:

答案 0 :(得分:0)

这是因为Javascript中的AJAX调用是异步的。您正在调用http请求,然后立即设置$scope.anumber = $scope.avariable而不是等待http响应。因此,当您第一次单击该按钮时,您实际上是在设置$scope.anumber = null。收到http响应后,$scope.avariable被设置为data.variable,然后退出该功能。

如果你想更新两者,你需要这样的东西:

$http.get('/employees/getthisdata/' + value + '.json').success(function (data) {
    $scope.avariable = data.avariable;
    updateANumber();
});
function updateANumber(){
    $scope.anumber = $scope.avariable;
}

答案 1 :(得分:0)

你也可以这样做:

$http.get('/employees/getthisdata/' + value + '.json').success(function (data) {
    $scope.avariable = data.avariable;
    $scope.anumber = $scope.avariable;
});

不需要超时部分。