使用Angular.js从Web服务获取数据

时间:2015-06-03 15:53:31

标签: angularjs angularjs-scope angular-http

我试图使用Angular从远程WS获取Json格式的数据,并且我遇到了一些麻烦。 数据来自Web服务正确,但我不能在控制器内使用它。 这是为什么? 角度代码:

var booksJson;
var app = angular.module('booksInventoryApp',[]);

// get data from the WS
app.run(function ($http) {
    $http.get("https://SOME_API_PATH").success(function (data) {
        booksJson = data;
        console.log(data);  //Working
    });
});

app.controller('booksCtrl', function ($scope) { 
    $scope.data = booksJson;
    console.log($scope.data); //NOT WORKING
});

HTML:

<section ng-controller="booksCtrl">
<h2 ng-repeat="book in data">{{book.name}}</h2>
</section>

4 个答案:

答案 0 :(得分:15)

您应该将$ http.get放在控制器中。

此外,Web服务返回的对象不是数组。所以你的ng-repeat应该是这样的:book in data.books

这是一个有效的例子:

var app = angular.module('booksInventoryApp', []);

app.controller('booksCtrl', function($scope, $http) {

  $http.get("https://whispering-woodland-9020.herokuapp.com/getAllBooks")
    .then(function(response) {
      $scope.data = response.data;
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<article ng-app="booksInventoryApp">
  <section ng-controller="booksCtrl">
    <h2 ng-repeat="book in data.books">{{book.name}}</h2>    
  </section>
</article>

答案 1 :(得分:0)

创建bookJSON作为数组,并推送元素而不是赋值。所以

var bookJSON=[];

$http.get内进行

data.forEach(function(item) { bookJSON.push(item); });

第二个控制台日志将显示未定义,因为该调用是异步的。作业将在未来发生。

run方法无法保证代码在控制器加载之前运行。

还有其他方法可以解决这个问题。

避免全局变量。查看$routeProvider resolve属性。

或实施服务以获取此数据作为承诺。

答案 2 :(得分:0)

您可以在控制器内使用$ http服务,而不是使用运行块,然后像往常一样将数据附加到范围。只需记住将$ http服务注入您的控制器。

app.controller('booksCtrl', function ($scope, $http) { 
    $http.get("https://whispering-woodland-9020.herokuapp.com/getAllBooks").success(function (data) {
        $scope.booksJson = data;
    });
});

答案 3 :(得分:0)

<!DOCTYPE html>
<html>
<head>
    <title>test your webservice</title>
</head>
<body>


<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<article ng-app="booksInventoryApp">
  <section ng-controller="booksCtrl">
  </section>
</article>
<script type="text/javascript">
    var app = angular.module('booksInventoryApp', []);

app.controller('booksCtrl', function($scope, $http) {



                        //ResponseInvocationAgentRequestDTO 
                        var jsonObject = {
                                      "id":65,
                                      "idUserSender": 5}


                                    console.log("aaaaaaaaaaaaaaaaaaaa");
            $http({
                method: 'put',             
                url: 'yout URI' ,
                data: jsonObject 
            })
            .success(function(data,status){
                console.log('all is good', data);

                })
                .error(function(data,status){
                    console.log('Erreur into url '+data);
                });


});

</script>
</body>
</html>