返回对象时的角度资源错误

时间:2015-12-31 01:28:31

标签: javascript angularjs angular-resource

我使用angular的资源来查询一些数据,问题是查询返回的不是这个:

[
    {"id":"5-w2k93ylznp6tj4i"}
    {"id":"6-njzmmwcpkw23ayvi"}
]

它的这个:

{"id":"5-w2k93ylznp6tj4i"}
{"id":"6-njzmmwcpkw23ayvi"}

而不是获取一个对象数组,我得到几个对象,这使得角度抛出这个错误:

SyntaxError: Unexpected token {
at Object.parse (native)

我认为错误是因为它不期望另一个对象。该查询是两个项目,如果我只查询一个项目,我只得到一个对象,没有错误。我怀疑当有两个项目时,它不会指望第二个对象,并在第一个对象结束后在第一个大括号中抛出错误。

一些代码:

这是资源:

list: resource (
            '/api/products',
            {
                limit: '@limit',
                skip: '@skip',
                sort: '@sort'
            }, 
            {
                query: {
                    method: 'GET',
                    interceptor: {
                        response: function (data) {
                            console.log('response in interceptor', data);
                        },
                        responseError: function (data) {
                            console.log('error in interceptor', data);
                        }
                    },
                    isArray: false
                }
            }
        ) 

使用资源的位置:

 factory.loadProducts = function(skip, sort){
    var data = Api.Product.list.query(
        {
            limit: appDataVars.limit,
            skip: skip,
            sort: sort
        }, function(response)
        {
            appDataVars.productsList = response;
        }, function(error)
        {
            console.error(error);
        });

    return data.$promise;
};

它总是遇到错误回调。

我的问题是我无法修改api,我必须找到一种方法来处理角度的结果集。知道我怎么能做到这一点? 感谢。

1 个答案:

答案 0 :(得分:2)

设置资源的查询对象以包含设置为空数组的transformResponse的属性:

query: {
    method: 'GET',
    interceptor: {
        response: function (data) {
            console.log('response in interceptor', data);
        },
        responseError: function (data) {
            console.log('error in interceptor', data);
        }
    },
    isArray: false,
    transformResponse: []
}

这将强制将响应视为字符串,然后将处理响应的函数更改为:

function(response)
{
    appDataVars.productsList = eval('[' + response.replace(/\n/g, ',') + ']');
}

如果响应字符串没有被对象之间的换行符分隔,则将其更改为response.replace(/}\s*{/g, '},{')(虽然这是一个非常天真的正则表达式)。

有点hacky,但它应该是一种解决方法,因为你无法修改API。