Как правильно написать перехватчик для ресурса?

Мне нужно преобразовать ответ службы при каждом получении, сохранении, обновлении. Я создал ресурс и добавил преобразователь, который выполняется, но структура возвращаемого объекта не такая, как если бы я не использовал преобразователь. Здесь я говорю о структуре ответа, а не об объекте, который я трансформирую. Вот мой ресурс:

angular.module('app')
   .factory('Insureds', ['$resource', 'config',  function ($resource, config) {

       function transform(response) {

           var insured = response.data.insured;


           return response;
       }

       var memberServicesHostName = config.memberServicesHostName;
       return $resource(memberServicesHostName + '/insureds/:insuredId', null,
       {
           'get': {
               method: 'GET', 'withCredentials': true, interceptor:
               {
                    response: function (response) { return transform(response).data; }
               }
           },
           'update': { method: 'PUT', 'withCredentials': true },
           'save': { method: 'POST', 'withCredentials': true }
       });
   }]);

Когда я не использую трансформатор, «застрахованный» находится на первом уровне, когда обещание разрешается, оно разрешается как экземпляр застрахованного объекта. Но с трансформатором есть объект-оболочка, который содержит свойства застрахованного и responseStatus. Вероятно, это связано с тем, что я возвращаюсь из «ответа» в перехватчике. Что нужно вернуть, исходный ответ, как я делаю, или response.data, или response.resource.insured? Я смущен...


person epitka    schedule 18.08.2014    source источник


Ответы (1)


Перехватчик ответа по умолчанию выглядит следующим образом:

function defaultResponseInterceptor(response) {
  return response.resource;
}

Поэтому, если вы хотите сохранить поведение по умолчанию, вы должны вернуть response.resource вместо response.data:

return $resource(memberServicesHostName + '/insureds/:insuredId', null, {
  get: {
    method: 'GET',
    withCredentials: true,
    interceptor: {
      response: function (response) {
        return transform(response).resource;
      }
    }
  },
  ...

Надеюсь это поможет.

person runTarm    schedule 18.08.2014