如何在AngularJS中向资源对象get()或update()添加特定的拦截器

时间:2018-08-30 08:26:55

标签: javascript angularjs hateoas

我目前正在使用角膜阴影(https://github.com/jmarquis/angular-hateoas)。我想向HateoasInterface中创建的资源的query()和get()函数添加特定的拦截器。我一直在寻找方法,但没有成功。

我认为可以这样添加:

var someResource = someService.resource('someresource');
someResource.query.interceptors = {
  response: function (data) {
    // do something data
    return data
  },
  responseError: function (error) {
    // do something with error
    return $q.reject(error);
  }
};

但这给了我

 TypeError: Attempted to assign to readonly property.

我可能需要使用$ decorator,但是我对此没有经验,也没有看到向特定资源对象添加特定拦截器的示例。

我真的不想使用$httpProvider.interceptors,因为我不想让拦截器在所有资源上工作。

我目前唯一能想到的就是使用包含特定拦截器的具有特定名称的函数来配置HateoasInterfaceProvider。

angular.module('myModule')
    .config(HateoasInterfaceConfig);

HateoasInterfaceConfig.$inject = ['HateoasInterfaceProvider'];

function HateoasInterfaceConfig(HateoasInterfaceProvider) {
    HateoasInterfaceProvider.setHttpMethods({
        get: {
            method: 'GET',
            isArray: false
        },
        getSomeResource: {
            method: 'GET',
            isArray: false,
            interceptors: {
                response: someResponseFunc,
                responseError: someErrorFunc
            }
        },
        update: {
            method: 'POST',
        },
        query: {
            method: 'GET',
            isArray: true
        }
        querySomeResource: {
            method: 'GET',
            isArray: true,
            interceptors: {
                response: function(data) { 
                    // do something with data
                    return data;
                },
                responseError: function (error) {
                    //do something with error
                    return $q.reject(error);
            }

        }
    });
    HateoasInterfaceProvider.setLinksKey('_links');
}

但是我不想那样做。

1 个答案:

答案 0 :(得分:0)

想通了。

调用资源时,可以传递参数和动作。

类似:

someServiceResult.resource('someresource',{},{get: {method: 'GET',...,
    interceptor: { response: responseInterceptorFunc, ...}}})

仍然不是真正的首选解决方案,但是当包装在服务中的函数中时,是可以接受的。

我想有一个解决方案,允许更改使用以下方法创建的Resource对象的拦截器定义:

someServiceResult.resource('someresource')

但是我目前没有时间解决这个问题。