我有一个休息API(感兴趣的人graphite realtime graphing),它使用了一些相当时髦的查询参数。例如,如果我想检查主机“abc”上的内存使用情况,请求看起来像
https://graphite/render?target=scale(keepLastValue(abc.memory.used.ratio),100)&format=json
请注意,“abc”字符串在target
查询参数的值内。
我有一个Angular工厂返回$resource
,目前看起来像这样
app.factory('Memory', ['$resource', function($resource) {
return $resource('https://graphite/render?target=scale(keepLastValue(:host.memory.used.ratio),100)', {
format: 'json'
});
}]);
通过
调用Memory.get({host: 'abc'});
这有效但我不禁觉得有一种更简洁的方法可以创建target
参数。我尝试将target
param指定为函数
app.factory('Memory', ['$resource', function($resource) {
return $resource('https://graphite/render', {
format: 'json',
target: function() {
return 'scale(keepLastValue(' + somehow_get_host_param + '.memory.used.ratio),100)';
}
});
}]);
但功能范围无法访问任何有用的信息(实际上,它根本没有范围)。
那么,有关如何创建$resource
参数以将模型值插入格式化字符串的任何提示?
感谢Peter's answer,我能够通过以下内容实现我想要的目标......
app.factory('Graphite', ['$resource', function($resource) {
var resource = $resource('https://graphite/render', {
format: 'json'
}, {
jsonp: {
method: 'JSONP',
isArray: true
}
});
return {
memory: function(host) {
return resource.jsonp({
target: 'scale(keepLastValue(' + host + '.memory.used.ratio),100)'
});
}
};
});
通过
调用Graphite.memory('abc');
答案 0 :(得分:3)
通过将现有代码包装到提供单参数函数API但仍然从资源返回相同基础承诺的服务,可以实现从提供给访问资源的代码的API中获得“neater”。那么你的代码可以做MemoryService.get(host)
,这是一个小小的整洁。
function MemoryService($resource) {
var api = $resource(
'https://graphite/render?target=scale(keepLastValue(:host.memory.used.ratio),100)',
{format: 'json'}
);
return {
get: function get(host) {
return api.get({host: host});
}
};
}
app.factory('Memory', ['$resource', MemoryService]);
答案 1 :(得分:1)
另一种方法是使用$http
拦截器将host=abc
速记查询参数转换为更全面的语法。
function expandTargetParam() {
return {
request: function request(config) {
if (config.url === '/render' && config.params.host) {
config.params.target = 'scale(keepLastValue(' +
config.params.host + '.memory.used.ratio),100)';
delete config.params.host;
}
return config;
}
};
}