$ resource transformResponse无效

时间:2013-03-16 22:21:12

标签: javascript angularjs

此处有一个简化的$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

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

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

所以你有两个选择:

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

答案 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;
}
通过这样做,你可以很好地配置常见的拦截器和一些请求自己的拦截器! :)
如果有更好的练习,请告诉我!谢谢!