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);
效果很好!我非常感谢您的帮助。