使用$ resource.query,我想返回一个包含实际资源数组的对象

时间:2015-01-26 18:13:12

标签: angularjs angular-resource

默认情况下,$resource.query()设置为期望成为$resource个对象的对象数组。为了以一种美好,安静的方式容纳分页,我设置了GET /api/widgets端点以返回以下对象:

{
  currentPage: 1,
  perPage: 20,
  totalItems: 10039,
  items: [{...}, {...}, {...}]
}

有没有办法让它能让angular知道items属性是$resource个对象的项目数组?

4 个答案:

答案 0 :(得分:23)

您需要指定自己的自定义操作。

我想你的代码看起来像这样:

factory('Widget', function($resource) {
  return $resource('/api/widgets');
});

将其更改为:

factory('Widget', function($resource) {
  return $resource(/api/widgets, null, {
    query: {
      method: 'GET',
      isArray: true,
      transformResponse: function(data) {
        return angular.fromJson(data).items;
      }
    }
  });
});

答案 1 :(得分:2)

简单就是使用$resouce.get,如果你想使用查询,你可以覆盖那个行为。

$resource('/notes/:id', null,
{
    'query':  {method:'GET', isArray:false}
});

更多信息https://docs.angularjs.org/api/ngResource/service/ $ resource

答案 2 :(得分:0)

我遇到了同样的问题,我想提出一个可能会更好的解决方案:

factory('Widget', function($resource) {
    return $resource(/api/widgets, null, {
        query: {
            interceptor: {
                response: function(response) {
                    return response.data.items;
                }
            }
        }
    }
}

我认为它可能会更好,因为你正在重复使用标准的角度行为(实际上,比fromJson稍微做一些)并截取输出结果来过滤你想要的。

答案 3 :(得分:0)

我使用此模式进行分页信息查询。

module.config(function($resourceProvider){
    $resourceProvider.defaults.actions.query = {
        method: 'GET',
        interceptor: {
            response: function(response) {
                response.resource.$totalCount = response.data.totalCount;
                response.resource.$limit = response.data.limit;
                response.resource.$offset = response.data.offset;
                return response.resource;
            }
        },
        transformResponse: function(data, headers, status) {
            var out = angular.fromJson(data);
            out.data.totalCount = out.totalCount;
            out.data.limit = out.limit;
            out.data.offset = out.offset;
            return out.data;
        },
        isArray: true
    };
})