此处有一个简化的$resource
示例(改编自Angular网站):
angular.module('project', ['mongolab']);
function ListCtrl($scope, Project) {
$scope.projects = Project.test();
}
angular.module('mongolab', ['ngResource']).
factory('Project', function ($resource) {
var url, dfParams, actions;
url = 'https://api.mongolab.com/api/1/databases' + '/angularjs/collections/projects/:id';
dfParams = {
apiKey: '4f847ad3e4b08a2eed5f3b54'
};
actions = {
test: {
method: 'GET',
isArray: true,
transformResponse: function (response) {
// line is never getting called
console.log('transforming');
return response;
}
};
var Project = $resource(url, dfParams, actions);
return Project;
});
问题是永远不会调用第console.log('transforming')
行。这是为什么?其他一切都很好。
小提琴here。
答案 0 :(得分:10)
此功能仅适用于1.1.2或更高版本的AngularJs。它在1.1.1或更早版本的AngularJs中不可用。
答案 1 :(得分:2)
$ resource服务中未公开响应转换回调。它位于底层的$ http服务中。
所以你有两个选择:
答案 2 :(得分:1)
我有同样的问题,我使用AngularJS 1.2.26
我已经定义了一个包含transformResponse
$ http级别的拦截器,如:
return {
'request': function (config) {
config.defaults.transformResponse = function(data){
//some has been done
};
return config;
},
当我删除上面的代码时,$ resource中的transformResponse
工作了!
为了解决这个问题,我在$ resource中定义了transformResponse
,如:
return $resource(pathConfig.serverURL + ':demoId',
{
demoId: "@id"
},
{
hello: {
method: "GET",
url: serverDomain + ":demoId",
transformResponse: addTransformResponses(
[
function (data, getHeaders) {
//doing hello's OWN interceptors
}
])
}
});
和addTransformResponses
包含常见拦截器,如:
addTransformResponses: function (addTrans) {
return [this.parseResponseJson, this.parseResponseArray]
.concat(addTrans);
},
//parse JSON
parseResponseJson: function (data, getHeaders) {
try {
return angular.fromJson(data);
} catch (e) {
console && console.error("return data is not a JSON!");
return data;
}
},
parseResponseArray: function (data, getHeaders) {
if (angular.isArray(data)) {
return {"array": data};
}
return data;
}
通过这样做,你可以很好地配置常见的拦截器和一些请求自己的拦截器! :)