2

在使用 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 的现有服务;我需要注射器吗?或者,还有更好的方法?

4

2 回答 2

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 方法的分散代码的需要,所以我想我会在这里分享。与其将所有直接的 restangular 调用重构为服务(更好的设计),不如将其与在多个地方调用的某些 API 活动的请求/响应联系起来,并且在收到响应时突然需要修改某些状态.

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

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

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

于 2014-03-29T01:30:50.170 回答
1

检查这篇文章:

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

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

由于 Restangular 返回了一个承诺,为了保持这个流程,你必须在你的服务中也返回一个承诺,你必须为此注入 $q 服务。

于 2013-11-05T14:34:48.713 回答