Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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 Angular$resource.get能否同时处理get的数组和非数组?_Angularjs - Fatal编程技术网

Angularjs Angular$resource.get能否同时处理get的数组和非数组?

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

有两种方法可以通过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: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;
                    }
                }
            }
        });