5

这里有一个简化的$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')永远不会被调用。这是为什么?其他一切正常。

在这里拉小提琴。

4

3 回答 3

10

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

于 2013-03-17T00:15:33.207 回答
2

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

所以你有两个选择:

  • 使用“低级” $http 而不是 $resource 抽象,
  • 在您的资源周围创建某种包装器,这将按照您想要的方式转换响应。
于 2013-03-16T23:03:01.610 回答
1

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

return {
  'request': function (config) {
      config.defaults.transformResponse = function(data){
          //some has been done
      };
      return config;
},

当我删除上面的代码时,我transformResponse的 in $resource 工作了!
为了解决这个问题,我transformResponse在 $resource 中定义了我的:

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;
}

通过这样做,您可以很好地配置常用的拦截器和一些请求自己的拦截器!:)
如果有更好的练习,请告诉我!谢谢!

于 2014-10-14T06:34:47.063 回答