允许Angular的$ resource的可变长度参数?

时间:2015-03-29 00:34:12

标签: angularjs angular-promise angular-resource

问题在这里,我有多个API调用:

www.domain.com/foo/bar?token=12345

中间可能有更多的子目录,可能会少一些。

我目前正在使用$ resource

agentApp.factory('apiFactory', function($resource) {
    return $resource('www.domain.com/v1/' + ':folder', 
    {
        'query': {
            method: 'GET',
            isArray: true
    }
});

调用如下:

apiFactory.query({folder: 'foo', token: '12345'}, function() {...})

我想让它更具可扩展性,因为我偶尔需要将isArray值更改为false,并且URL中的子目录数量有时是未知的,所以我&#39 ; d更喜欢不使用$resource的{​​{1}}结构,而只是使用一个字符串。

是否有我可以创建的服务允许我按如下方式拨打电话:

:token

到目前为止,我尝试了以下内容,显然没有给我我想要的内容,我不确定如何获得$资源来实际启动API调用,我把它放了对资源如何运作的基本误解:

apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });

我试图打电话如下:

agentApp.factory('apiService', ['$resource', '$q', function ($resource, $q) {
    var factory = {
        query: function (urlStringAndQueries, isArray) {
            return $q(
                function() {
                    $resource('www.domain.com/v1/' + ':location', { location: urlStringAndQueries }, {
                        'query': {
                            method: 'GET',
                            isArray: isArray
                        }
                    });
                }
            )
        },
    return factory;
}]);

非常感谢任何帮助和/或建议。 谢谢!

编辑:这是我的解决方案,直到出现更通用的模式

我无法在外部向基本网址字符串提供额外的实体,例如: apiService.query('/foo/bar?token=12345', true) .then(function(response) { ...do something with response }); ,由于foo/bar?token=12345固有编码网址,因此字符(/?=)会转换为其编码对应项。因此,在模式中分离字符串:

$response

这个解决方案仍然假设我有一定数量的路径,这不是理想的,但至少它很容易重复使用。

仍然接受更多更好的建议:)

1 个答案:

答案 0 :(得分:1)

我不明白为什么你再次从你的服务方法返回promise对象,而$ resource返回promise本身。不要那样做

<强>代码

agentApp.factory('apiService', ['$resource', '$q', function($resource, $q) {
    var factory = {
        resourceObj: function(urlStringAndQueries, isArray) {
            return $resource('www.domain.com/v1/' + ':location', {
                location: urlStringAndQueries
            }, {
                'query': {
                    method: 'GET',
                    isArray: isArray
                }
            });
        )
    }
}]);

调用工厂方法,然后您将获得对资源对象的访问权限,然后调用该资源对象方法的query

<强>控制器

apiService.resourceObj('/foo/bar?token=12345', true).query()
    .then(function(response) { ...do something with response });