从Restangular ResponseInterceptor(ResponseExtractor)中调用服务

时间:2013-11-05 14:30:43

标签: angularjs restangular

我正在尝试使用Restangular将项目添加到集合后,从后端服务中获取的元素上展开外键字段。

服务使用该元素响应我的POST,包括链接到相关对象的url字段,并且我已经为这些对象提供了服务。

回复如下:

{
    "url": "http://api.example.com/resources/6/", 
    "name": "Harry", 
    "role": "http://api.example.com/roles/1/", 
}

我想将role字段扩展为:

{
    "url": "http://api.example.com/resources/6/", 
    "name": "Harry", 
    "role": "Administrator", 
}

到目前为止,我有以下内容:

Configurer.setResponseInterceptor(function(data, operation, what, url, response, deferred) {
    if ((operation == 'post' || operation == 'put') && what == 'resources' && 'role' in data && data.role.substr(0,4) == 'http') {
        console.log('Role URL instead of name -- change this');
    }
    return data;
});

我理想地想要调用包含Restangular的现有服务;我需要注射器吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

FWIW,原始问题的目标是可能。

"从Restangular ResponseInterceptor中调用服务"

示例:

angular.module('app').factory('myApi', [
  'Restangular', 'myService', '$rootScope', function(restangular, myService, $rootScope) {
    return restangular.withConfig(function(c) {
      c.setResponseInterceptor(function(data, op, what, url, response, deferred) {
        if (op === 'post' && what === 'the_name_of_some_resource' && url.match(/something_or_other/)) {
          myService.doSomething(response.data.something_cool);
          $rootScope.$emit('didSomethingCool');
        }
        return response.data;
      });
    });
  }
]);

然后注入myApi并用它代替Restangular。响应拦截器可以访问myService。注意,这不是很好的设计(很难测试),但是这些方面的东西对我来说很方便,不需要重构一堆直接调用restangular方法的扩展代码,所以我想我和我#39; d在这里分享。这不是将所有直接的restangular调用重构为服务(更好的设计),而是一种绑定到多个地方调用的某些API活动的请求/响应的方法,并且每当收到响应时突然需要修改某个状态

$ rootScope部分对于OP的问题不是必不可少的,我把它包括在内以说明你可以将任意东西(不是提供者)注入工厂,该工厂提供带有修改配置的restangular;这当然包括您自己的服务实例,然后可以从响应拦截器调用它。

另一个注意事项:不推荐使用setResponseInterceptor,它的后继者addResponseInterceptor有不同的签名(我认为)

这些都没有经过测试,我也没有检查过我的事实。

答案 1 :(得分:1)

查看这篇文章:

http://ath3nd.wordpress.com/2013/08/05/15/

有一个例子:服务器增加一个返回。

由于Restangular返回一个promise,为了保留该流,你必须在你的服务中返回一个promise,你必须为它注入$ q服务。