javascript - 返回对象时出现 Angular 资源错误

标签 javascript angularjs angular-resource

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

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

它是这样的:

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

我没有得到一个对象数组,而是得到了几个对象,这使得 Angular 抛出这个错误:

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

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

一些代码:

这是资源:

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,我必须找到一种方法来处理 Angular 中的结果集。知道我怎样才能实现这一目标吗? 谢谢。

最佳答案

将资源的查询对象设置为包含设置为空数组的 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。

关于javascript - 返回对象时出现 Angular 资源错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539806/

相关文章:

javascript - 当使用 SWFUpload 启用 Flash 时,如何隐藏 html 上传?

javascript - Javascript在一段时间后执行函数

javascript - 使用 javascript 随时间滚动的动态条形图

javascript - 在 Firebase 中对项目集合进行建模的正确方法

javascript - angularjs $resouce 方法中的可选参数

javascript - 在 AngularJS 中从 $resource.get() 读取数据

javascript - 无法读取未定义的 ngResource 的属性 '$remove'

javascript - 如何使用 jeasyui 将 $scope.mydata 以 Angular 绑定(bind)到数据选项?

javascript - 如何在 angular.js View 中按名称呈现数组成员?

javascript - 不再支持通过 UIManager ['getConstants' 直接从 UIManager 访问 View 管理器配置