我正在尝试使用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的现有服务;我需要注射器吗?或者有更好的方法吗?
答案 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服务。