Angularjs Angular$resource.get能否同时处理get的数组和非数组?
有两种方法可以通过ID获取REST资源:Angularjs Angular$resource.get能否同时处理get的数组和非数组?,angularjs,Angularjs,有两种方法可以通过ID获取REST资源: GET /users/1 GET /users/1,2 第一个返回单个对象,如{id:1,name:“John”},而第二个返回数组,如[{id:1,name:“John”},{id:2,name:“Jill”} 请不要争论这是否是合法的休息;只要接受服务有这个,我就需要使用它 angular的$resource实际上从请求端智能地处理它: 转化为 GET /users/1,2 但它不能很好地处理响应。它需要一个对象。如果我将定义更改为isArray
GET /users/1
GET /users/1,2
第一个返回单个对象,如{id:1,name:“John”}
,而第二个返回数组,如[{id:1,name:“John”},{id:2,name:“Jill”}
请不要争论这是否是合法的休息;只要接受服务有这个,我就需要使用它
angular的$resource实际上从请求端智能地处理它:
转化为
GET /users/1,2
但它不能很好地处理响应。它需要一个对象。如果我将定义更改为isArray:true
,那么它在单个请求GET/users/1
我如何让它智能地处理这两个问题
编辑:我做了一些奇怪的黑客操作来让它工作,但我更喜欢本地方法:
factory('Resource',['$resource','_',function ($resource,_) {
return function(url,params,methods){
var defaults = {
getSingle: {method: 'get', isArray:false},
getMultiple: {method: 'get', isArray:true}
}, resource = $resource(url,params,angular.extend(defaults,methods)), urlParams = {};
_.each(url.split(/\W/), function(param){
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(url))) {
urlParams[param] = true;
}
});
// do not override if they did
if (!(methods||{}).get) {
resource.get = function (params,success,error) {
// look for multiples
var isMultiple = false;
_.each(params,function (val,key) {
if (key && urlParams[key] && angular.isArray(val)) {
isMultiple = true;
return(false);
}
});
return this[isMultiple?"getMultiple":"getSingle"](params,success,error);
};
}
return(resource);
};
}]).
通常的惯例是为单个对象创建一个
Resource.get()
方法,为它们的数组创建一个Resource.query()
方法。我在尝试对post执行PUT请求时遇到了类似的问题。当前,如果一切正常,API将返回一个表示post的对象,但如果出现错误(例如授权凭据不匹配),则返回一个错误数组。因此,我在资源配置中得到了错误error:[$resource:badcfg]错误。预期响应包含对象,但获得数组
我通过在自定义操作对象上使用transformResponse属性找到了解决方案。我定义了一个函数来检查响应,如果它是一个数组,它将数组转换成一个对象。这似乎工作正常,并且似乎比您在更新中发布的解决方案要简单一些:
var wpPost = $resource(PATH_TO_WORDPRESS_API + 'posts/:id', {},
{
'update': {
method: 'PUT',
params: {id: '@id'},
transformResponse: function(data) {
var response = angular.fromJson(data);
if (response.length) {
// the response is an array, so convert it into an object
var object = {};
for( var i = 0; i < response.length; i ++) {
object[i] = response[i];
}
return object;
} else {
return response;
}
}
}
});
var wpPost=$resource(路径到API+'posts/:id',{},
{
“更新”:{
方法:'放',
参数:{id:'@id'},
transformResponse:功能(数据){
var response=angular.fromJson(数据);
if(响应长度){
//响应是一个数组,因此将其转换为对象
var对象={};
对于(变量i=0;i
好吧,查询是针对不同参数的一般查询。这绝对是一个get
,但对于多个。。。甚至$resource也知道在请求端要做什么,因为它将其转换为逗号分隔的列表。你是说我需要Resource.getMultiple()
或类似的吗?是的,我会试试。这个应该是选中的anwser,非常简单,可以在TransformResponse方法中更改响应,但我建议你将if语句更改为if(数组的响应实例),这样会更准确
var wpPost = $resource(PATH_TO_WORDPRESS_API + 'posts/:id', {},
{
'update': {
method: 'PUT',
params: {id: '@id'},
transformResponse: function(data) {
var response = angular.fromJson(data);
if (response.length) {
// the response is an array, so convert it into an object
var object = {};
for( var i = 0; i < response.length; i ++) {
object[i] = response[i];
}
return object;
} else {
return response;
}
}
}
});