【问题标题】:Angularjs resource factory transformResponse is not calledAngularjs资源工厂transformResponse没有被调用
【发布时间】:2013-08-11 00:11:57
【问题描述】:

下面是我的代码

MY_MODULE.factory("SOME_API", ['$resource', '$http', '$rootScope', function($resource, $http, $rootScope){

  return $resource("/appi/get/", {responseFormat: 'json', responselanguage:'English', pageno:1}, {
    search:{
      method:'GET',
      transformResponse: [function (data, headersGetter) {
          console.log(data);
          // you can examine the raw response in here
          $log.info(data);
          $log.info(headersGetter());
          return {tada:"Check your console"};
      }].concat($http.defaults.transformResponse),
      params:{
        param1:'SOME_DATA',
        param2:'SOME_DATA2',
      }
    }
  }
}

我正在使用 angular 1.0.7,无法弄清楚为什么我的 transformResponse 没有被调用。我相信这个版本的angular支持transformResponse,如果不是如何实现类似的回调。

【问题讨论】:

  • 我已在this 上发布了答案。这可能会有所帮助。

标签: javascript angularjs angularjs-resource angularjs-factory


【解决方案1】:

transformResponse 不是$resource 的参数。响应拦截器在$httpProvider 上配置。请参阅$httpdocumentation(部分Response Interceptor)。

请记住,一旦配置完成,这些拦截器就会针对$http 发出的每个请求运行。

【讨论】:

  • 我提到了一个 github 代码,github.com/nameoffnv/funsite/blob/…,所以我相信我可以这样使用它。此外,transformResponse 不是资源的参数,它是资源操作的参数,该操作又在内部发送到 $http。
  • 好的,我看到在 $http 文档中确实有可用的参数。您可以尝试使用$http 而不是资源来调用服务吗?
【解决方案2】:

是否可以使用 AngularJS 1.2?

我在 1.0.8 中遇到了完全相同的问题。在我更改为 angular-1.2.0-rc.2 后,我的资源的 transformResponse 回调开始被调用。

【讨论】:

  • 我知道我可以升级,但由于我有旧代码无法做到这一点。但是我找到了解决方法,必须创建一个自定义资源函数,该函数采用与默认资源函数类似的输入,但可以按我的意愿工作。我将发布解决方案作为答案。
【解决方案3】:

下面是解决方案,基本上是 $http 的包装器,它模拟默认资源

$rootScope.woiresource = function (url, defaults, actions) {
  var $res = {};

  for (var i in actions) {

    var default_params = {};

    for (var di in defaults) {
      default_params[di] = defaults[di];
    }

    for (var ai in actions[i].params) {
      default_params[ai] = actions[i].params[ai];
    }

    $res[i] = (function (url, method, default_params) {
      return function (params, callback, headers) {

        if (typeof params == 'function') {
          callback = params;
          params = {};
        }

        if (typeof headers == 'undefined') {
          headers = {};
        }

        for (var pi in params) {
          default_params[pi] = params[pi];
        }

        return $http({
          url: url,
          method: method,
          transformResponse: [function (strData, headersGetter) {
              //Do Something

          }].concat($http.defaults.transformResponse),
          params: default_params,
          headers: headers,

        }).success(function (data) {
          callback(data);
        });
      };
    })(url, actions[i].method, default_params);
  }

  return $res;
};

参数与默认资源类似,只是改变了工作方式,希望这对某些人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多