Javascript $resource transformResponse不工作

Javascript $resource transformResponse不工作,javascript,angularjs,Javascript,Angularjs,这里有一个简化的$resource示例(改编自Angular site): angular.module('project',['mongonab']); 函数ListCtrl($scope,Project){ $scope.projects=Project.test(); } 角度.module('mongolab',['ngResource'])。 工厂(‘项目’、功能($resource){ var url、dfParams、actions; url='1〕https://api.mong

这里有一个简化的
$resource
示例(改编自Angular site):

angular.module('project',['mongonab']);
函数ListCtrl($scope,Project){
$scope.projects=Project.test();
}
角度.module('mongolab',['ngResource'])。
工厂(‘项目’、功能($resource){
var url、dfParams、actions;
url='1〕https://api.mongolab.com/api/1/databases“+”/angularjs/collections/projects/:id”;
dfParams={
apiKey:'4f847ad3e4b08a2eed5f3b54'
};
行动={
测试:{
方法:“GET”,
伊萨雷:没错,
transformResponse:功能(响应){
//永远不会有人打电话
console.log('transforming');
返回响应;
}
};
var Project=$resource(url、dfParams、actions);
返回项目;
});
问题是,
console.log('transforming')
这一行永远不会被调用。为什么呢?其他一切都正常


Live fiddle。

响应转换回调未在$resource服务中公开。它位于底层$http服务中

所以你有两个选择:

  • 使用“低级”$http而不是$resource abstraction
  • 在您的资源周围创建某种包装器,以您想要的方式转换响应

此功能仅在AngularJs的1.1.2或更高版本中可用。在AngularJs的1.1.1或更早版本中不可用。

我也有同样的问题,我使用AngularJs 1.2.26。
我定义了一个拦截器,它包含$http级别的
transformResponse
,如:

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;
}
通过这样做,您可以很好地配置常见的拦截器和某些请求自己的拦截器!:)

如果有更好的练习,请告诉我!谢谢!

我也这么认为(未在
$resource
中公开)但是我看了
$resource
的代码,它被记录在了中。另外,通过阅读代码,你可以看到它扩展了
httpConfig
和。这似乎是有意的,因为他们是为了它。你在看不稳定的主分支,它还没有发布。是的,我是通过@rgaskill answer得到的。谢谢。你到底在哪里添加
addTransformResponses
parseResponseJson
parseResponseArray
函数?