首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角资源响应拦截器

角资源响应拦截器
EN

Stack Overflow用户
提问于 2014-03-27 13:51:39
回答 2查看 584关注 0票数 0

我想要创建一个对资源的自定义操作,它将处理从服务器接收的结果。

代码语言:javascript
复制
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;
                }
              }
            }
          }
      );
    })
;

但是当我使用Custom时,我得到未经修改的结果,而不是处理结果。下面的代码显示了预期的行为(以及注释中的相关错误):

代码语言:javascript
复制
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."

  }));
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 14:24:37

也许您需要添加一个新的transformResponse转换,您可以很容易地这样做(记住要注入$http):

代码语言:javascript
复制
transformResponse: $http.defaults.transformResponse.concat([
    function (data, headersGetter) {
       return data.objects
    }

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-07 08:05:16

谢谢你的“拦截器”主意!

照我的想法

代码语言:javascript
复制
response.data = [5, 6]; // for simplifity
return response;

应该返回带有属性数组"data“的响应对象,因此

代码语言:javascript
复制
result.length;

应该会失败。

为了更好地操作资源响应的结果,最好使用response.resource而不是response.data --有真正的REST对象(使用CRUD方法)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22689683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档