为资源编写拦截器的正确方法是什么?

时间:2014-08-18 15:43:17

标签: angularjs angularjs-resource

我需要在每次获取,保存,更新时转换服务响应。我已经创建了一个资源并添加了一个执行的变换器,但是返回的对象的结构与我不使用变换器时的结构不同。在这里,我谈论的是响应的结构,而不是我正在转变的对象。 这是我的资源:

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

当我不使用变压器时,“保险”在承诺得到解决后处于第一级,它将作为保险对象的实例解析。但是对于变换器,有一个包装器对象,它包含insured和responseStatus属性。它可能与我从拦截器中的“响应”返回的内容有关。应该返回什么,原始响应,就像我在做什么,或者响应.data,还是response.resource.insured?我很困惑......

1 个答案:

答案 0 :(得分:0)

默认的响应拦截器是这样的:

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

希望这有帮助。