angularjs - 从 Restangular ResponseInterceptor (ResponseExtractor) 中调用服务

标签 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 的服务;我需要注入(inject)器吗?或者有更好的办法吗?

最佳答案

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;
      });
    });
  }
]);

然后只需注入(inject) myApi 并使用它代替 Restangular。响应拦截器可以访问 myService。请注意,这不是一个很好的设计(很难测试),但是这些方面的一些东西对我来说很方便,可以推迟重构一堆直接调用矩形方法的展开代码的需要,所以我想我会在这里分享。这是一种与某些 API 事件的请求/响应相关联的方法,这些 API 事件在多个位置调用,并且在收到响应时突然需要修改某些状态,而不是将所有直接的 restangular 调用重构到服务中(更好的设计) .

$rootScope 部分对于 OP 的问题并不重要,我将其包含在内是为了说明您可以将任意内容(而不是提供程序)注入(inject)到一个工厂中,该工厂提供带有修改后的配置的 reangular ;这当然包括您自己的服务实例,然后可以从响应拦截器调用它们。

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

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

关于angularjs - 从 Restangular ResponseInterceptor (ResponseExtractor) 中调用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791352/

相关文章:

angularjs - (注入(inject)函数的)参数上的下划线是什么意思?

angularjs - Restangular:错误:未知提供商

javascript - 如何在发送到 AngularJS 中的服务器之前从 JSON 中删除多余的引号

javascript - AngularJs 在 post 中使用对象

javascript - Angular : Enhancing or wrapping promises with pre/post resolve/reject actions

angularjs - 在矩形中为单个请求设置 header 和http参数

javascript - 将 tastypie 过滤器与 AngularJS 和 RESTANGAL 一起使用

javascript - 使用 Restangular 并尝试将多个参数设置为 $scope 中的 var

javascript - 基于 true/false 变量显示/隐藏进度条

javascript - 套件与规范 Protractor