我使用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/