Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 使用$resource.query,我想返回一个包含实际资源数组的对象_Angularjs_Angular Resource - Fatal编程技术网

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

Angularjs 使用$resource.query,我想返回一个包含实际资源数组的对象,angularjs,angular-resource,Angularjs,Angular Resource,默认情况下,$resource.query()设置为期望一组对象成为$resource对象。为了以一种友好、restful的方式适应分页,我设置了GET/api/widgets端点以返回以下对象: { currentPage: 1, perPage: 20, totalItems: 10039, items: [{...}, {...}, {...}] } 有没有办法让angular知道items属性是要成为$resource对象的项的数组?最简单的方法是使用$resource

默认情况下,
$resource.query()
设置为期望一组对象成为
$resource
对象。为了以一种友好、restful的方式适应分页,我设置了
GET/api/widgets
端点以返回以下对象:

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

有没有办法让angular知道
items
属性是要成为
$resource
对象的项的数组?

最简单的方法是使用
$resource.get
,如果您想使用查询,您可以覆盖该行为

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

更多信息$resource

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

我想您的代码应该是这样的:

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

我也有同样的问题,我想提出一个更好的解决方案:

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

我认为这可能更好,因为您正在重用标准的角度行为(实际上,这比JSON中的
fromJson
)并截取输出结果以过滤所需内容。

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

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

这不能解决我的问题。整个响应对象将是一个
$resource
,尝试调用
$save
$update
将尝试保留不属于实际资源模型的值。我需要配置
$resource.query()
以知道实际的资源对象包含在响应的
数组中。我已经这样做了,并且对我有效,我不知道它如何工作,当你调用更新时,你将指定id和新对象,我不知道它如何工作
myresource.update({id:1}。{property1:1,property2:2})
如果我严格地将
$resource
用作构造请求和获取响应对象的机制,这将起作用,但是,
$resource
的其他特性还没有被广泛理解。具体来说,对象REST端点返回的对象本身成为
$resource
对象。在我的例子中,我需要一种方法来告诉angular,返回对象的
list
属性是实际的资源。请参阅接受的答案。因此,使用这种方法,我如何从transformResponse方法外部访问分页信息?Y您肯定已经回答了最初的问题,但现在我有一个新问题:)不完全确定,但您可以尝试以下
var widgets=Widget.query();widgets.$promise.then(函数(数据){console.log(数据);})所以我所做的就是设置isArray:false并保持返回对象的形状。我在items
中迭代了item中的item并替换了它们:
data.items[I]=new Widget(item);
效果很好!我非常感谢您的帮助。