14

I am trying to learn angularjs, and have hit a block in trying to databind to an array returned from a Rest API. I have a simple azure api returning an array of person objects. Service url is http://testv1.cloudapp.net/test.svc/persons.

My controller code looks like:

angular.module("ToDoApp", ["ngResource"]);
function TodoCtrl($scope, $resource) {
$scope.svc = $resource('http://testv1.cloudapp.net/test.svc/persons', {
    callback: 'JSON_CALLBACK'
}, {
    get: {
        method: 'JSONP',
        isArray: true
    }
});
$scope.items = $scope.svc.get();
$scope.msg = "Hello World";
}

My html looks like:

<html>
<head></head>
<body>
<div ng-app="ToDoApp">
    <div ng-controller="TodoCtrl">
         <h1>{{msg}}</h1>

        <table class="table table-striped table-condensed table-hover">
            <thead>
                <th>Email</th>
                <th>First Name</th>
                <th>Last Name</th>
            </thead>
            <tbody>
                <tr ng-repeat="item in items">
                    <td>{{item.Email}}</td>
                    <td>{{item.FirstName}}</td>
                    <td>{{item.LastName}}</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
</body>
</html>

Question: The table in above html is not displaying any data. I can see the call to the api in Firebug, and can also see the JSON response from the api. What am I doing incorrectly that is causing the databinding to the REST api not work?

PS:JSFiddle demonstrating this issue is at: http://jsfiddle.net/jbliss1234/FBLFK/4/

4

6 回答 6

29

为了使用 $resource 服务处理数组,建议您使用查询方法。正如您在下面看到的,查询方法是为处理数组而构建的。

{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };

为了将此数组返回到您的范围,您应该使用的代码是

angular.module("ToDoApp", ["ngResource"]);

function TodoCtrl($scope, $resource) {
    var svc = $resource('http://testv1.cloudapp.net/test.svc/persons');
    $scope.items = svc.query();
    $scope.msg = "Hello World";
}

这假定您的 REST API 正在工作并将返回一个数组。

如需进一步阅读,请前往文档

http://docs.angularjs.org/api/ngResource.$resource

于 2013-07-24T02:45:46.510 回答
11

只是想交叉发布我对 Aleksander 在另一个 stackoverflow 问题上给出的解决方案的改编:https ://stackoverflow.com/a/16387288/626810 :

methodName: {method:'GET', url: "/some/location/returning/array", transformResponse: function (data) {return {list: angular.fromJson(data)} }}

所以当我调用这个函数时:

var tempData = ResourceName.methodName(function(){
  console.log(tempData.list); // list will be the array in the expected format
});

如果您需要在多个方法/资源中获取数组,显然这有点笨重,但它似乎工作。

于 2014-03-18T21:17:36.923 回答
7

如果您有嵌套对象,请使用 isArray 参数:

angular.module('privilegeService', ['ngResource']).
factory('Privilege', function ($resource) {
    return $resource('api/users/:userId/privileges', 
                     {userId: '@id'}, 
                     {'query':  {method:'GET', isArray:false}});
});

您可以使用container.object.property符号来访问对象及其属性。

于 2013-03-31T06:30:13.830 回答
0

您从服务器返回的阵列不是一个干净的阵列,但有一些额外的属性。这使得ng-repeat当您使用in.

您需要一个特殊的迭代器从服务器遍历数组,这将忽略那些额外的属性。所以先通过提取数组数据forEach,像这样:

$scope.items = []
var response = $scope.svc.get();
angular.forEach(response, function(item) {
  $scope.items.push(item);
});

然后你可以做

<tr ng-repeat="item in items">
于 2014-07-03T20:18:55.137 回答
0

不确定我们是否在使用 json 和 REST 时遇到同样的问题,但这篇文章解决了我的问题:字符串数组未通过角度资源正确呈现

于 2014-02-25T23:05:02.993 回答
0

我有类似的问题,但没有一个答案对我很有效,这就是我所做的:

    $resource("/", {}, {
       query: {
            method: 'GET',
            isArray: false,
            transformResponse: function (data, headers) {
                //if no data return so no warnings
                if (data == ''){
                    return;
                }

                return {data: $.extend({}, eval("{" + data + '}'))};
            }
        }
   });

使用 jquery。基本上将数组转换为对象,因此 angularjs 资源不会大便。

于 2016-03-08T20:42:04.083 回答