Фабрика ресурсов Angularjs transformResponse не вызывается

Ниже мой код

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, если не то, как реализовать аналогичный обратный вызов.


person Sudesh    schedule 09.08.2013    source источник
comment
Я разместил ответ на этом. Это может быть полезно.   -  person soytian    schedule 14.10.2014


Ответы (3)


transformResponse не является параметром $resource. Перехватчик ответа настроен на $httpProvider. См. документацию документа $http (раздел Response Interceptor).

Имейте в виду, что после настройки эти перехватчики будут запускаться для каждого запроса, сделанного $http.

person Chandermani    schedule 09.08.2013
comment
Я сослался на код github, github.com/nameoffnv/funsite/ blob/, поэтому я думаю, что могу использовать его таким образом. Кроме того, transformResponse не является параметром ресурса, это параметр действия ресурса, которое в свою очередь отправляется в $http внутренне. - person Sudesh; 09.08.2013
comment
Хорошо, я вижу, что в документации $http действительно есть доступный параметр. Можете ли вы попробовать вызвать службу, используя $http вместо ресурса. - person Chandermani; 09.08.2013

Можно ли использовать AngularJS 1.2?

У меня была точно такая же проблема с 1.0.8. После того, как я перешел на angular-1.2.0-rc.2, начал вызываться обратный вызов моего ресурса transformResponse.

person rvl    schedule 05.10.2013
comment
Я знал, что могу обновиться, но, поскольку у меня был устаревший код, я не мог этого сделать. Но я нашел обходной путь, мне пришлось создать пользовательскую функцию ресурсов, которая принимала те же входные данные, что и функция ресурсов по умолчанию, но работала так, как я хотел. Я опубликую решение как ответ. - person Sudesh; 07.10.2013

Ниже приведено решение, в основном обертка для $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;
};

Параметры аналогичны ресурсу по умолчанию, просто изменена работа, надеюсь, это поможет некоторым людям.

person Sudesh    schedule 10.10.2013