2014-03-27 120 views
0

我想在资源上创建一个自定义操作,它将处理从服务器接收到的结果。角度资源响应拦截器

angular.module('problem', ['ngRoute', 'ngResource']) 
    .factory('Abc', function ($resource) { 
     return $resource('api/abc/:abcId', {abcId: '@id'}, { 
      customQuery: { 
       method: "GET", 
       isArray: true, 
       interceptor: { 
       response: function (response) { 
        // some operations that manipulate data based od response 
        response.data = [5, 6]; // for simplifity 
        console.log("manipulation finished"); // log is saved 
        return response; 
       } 
       } 
      } 
      } 
    ); 
    }) 
; 

但是,当我使用自定义操作时,我得到了未修改的结果,而不是处理。 下面是该预期的行为(和评论相关错误)代码:

describe('Abc', function() { 
    beforeEach(module('problem')); 
    var $httpBackend; 
    beforeEach(function() { 
    angular.mock.inject(function ($injector) { 
     $httpBackend = $injector.get('$httpBackend'); 
    }) 
    }); 

    it('should return converted array when customQuery called', inject(function (Abc) { 
    $httpBackend 
     .expectGET('api/abc') 
     .respond([ 
      {id: 'uid1', name: 'name1'}, 
      {id: 'uid2', name: 'name2'}, 
      {id: 'uid3', name: 'name3'}, 
      {id: 'uid4', name: 'name4'} 
     ]); 

    var result = Abc.customQuery(); 
    $httpBackend.flush(); 

    expect(result.length).toBe(2); // fails with "Expected 4 to be 2." 
    expect(result[0]).toBe(5);  // fails with "Expected { id : 'uid1', name : 'name1' } to be 5." 
    expect(result[1]).toBe(6);  // fails with "Expected { id : 'uid2', name : 'name2' } to be 6." 

    })); 
}); 

回答

0

感谢你的“拦截器”的想法!

在我看来

response.data = [5, 6]; // for simplifity 
return response; 

应该返回响应对象,有一个属性阵列 “数据”,所以

result.length; 

应该失败。

用于操纵资源响应的结果更好地使用响应。 资源,而不是response.data - 有真正的REST对象(与CRUD方法)

0

也许你需要做的是增加一个新的transformResponse改造,你可以很容易做到,像这样(记住注入$http):

transformResponse: $http.defaults.transformResponse.concat([ 
    function (data, headersGetter) { 
     return data.objects 
    } 

不同的是,result将由response.resource被取代,而拦截器的返回值是解决result.$promise