Angularjs $resource not working with an array returned from a REST API

前端 未结 6 2140
失恋的感觉
失恋的感觉 2020-12-06 05:15

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 objec

相关标签:
6条回答
  • 2020-12-06 05:55

    In order to handle arrays with the $resource service, it's suggested that you use the query method. As you can see below, the query method is built to handle arrays.

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

    The code you should use in order to return this array to your scope is

    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";
    }
    

    This assumes that your REST API is working and will return an array.

    For further reading head to the docs

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

    0 讨论(0)
  • 2020-12-06 06:06

    Not sure if we are having the same problem with json and REST, but this post solved my problem: array of strings not rendered correctly through angular resource

    0 讨论(0)
  • 2020-12-06 06:09

    Just wanted to cross-post my adaptation of a solution Aleksander gave on another stackoverflow question: https://stackoverflow.com/a/16387288/626810:

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

    So when I call this function:

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

    Obviously this a little bulky if you need to GET arrays in multiple methods / resources, but it seems to work.

    0 讨论(0)
  • 2020-12-06 06:09

    The array you get back from the server isn't a clean array, but has some extra properties. That makes ng-repeat not show anything when you iterate over it using in.

    You need a special iterator to go over the array from the server, which will ignore those extra properties. So extract the array data through forEach first, like this:

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

    Then you can do

    <tr ng-repeat="item in items">
    
    0 讨论(0)
  • 2020-12-06 06:14

    I had similar problem and non of the answers quite worked for me, heres what i did:

        $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 + '}'))};
                }
            }
       });
    

    Uses jquery. Basically convert array to object so angularjs resource doesn't poop its pants.

    0 讨论(0)
  • 2020-12-06 06:18

    Use isArray param, if you have nested objects:

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

    Than you can use container.object.property notation to access objects and its properties.

    0 讨论(0)
提交回复
热议问题