将数据值插值到Angular $ resource查询参数中

时间:2014-08-13 23:21:52

标签: angularjs angular-resource

我有一个休息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');

2 个答案:

答案 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;
    }
  };
}