2014-03-27 160 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