在将项目添加到集合后,我尝试使用 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/