首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许变长参数到角的$resource?

允许变长参数到角的$resource?
EN

Stack Overflow用户
提问于 2015-03-29 00:34:11
回答 1查看 103关注 0票数 1

问题是,我有多个API调用要按照以下思路进行:

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

中间可能有更多的子目录,可能有更少的子目录.

我目前正在使用$resource

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

它的调用如下:

代码语言:javascript
复制
apiFactory.query({folder: 'foo', token: '12345'}, function() {...})

我想使它更可扩展,因为我需要偶尔将isArray值更改为false,并且有时URL中的子目录数量是未知的,所以我宁愿不使用$resource:token结构,而只使用一个带有字符串的结构。

我是否可以创建一项服务,使我能够按以下方式进行呼叫:

代码语言:javascript
复制
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });

到目前为止,我已经尝试了以下方法,这显然没有给我想要的东西,我不知道如何让$resource真正启动API调用,我把这归结为对$resource工作方式的根本误解:

代码语言:javascript
复制
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;
}]);

我试图将其称为:

代码语言:javascript
复制
apiService.query('/foo/bar?token=12345', true)
    .then(function(response) { ...do something with response });

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

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

我不能简单地向外部的基本URL字符串提供一个额外的实体,例如foo/bar?token=12345,因为$response固有的编码URL,所以字符(/?=)被转换成它们的编码对应项。因此,模式中字符串的分离:

代码语言:javascript
复制
agentApp.factory('apiService', ['$resource', function($resource) {
    var factory = {
        resourceObj: function(isArray, urlStringAndQueries) {

            /* urlStringAndQueries will be variadic parameters,
            so we deconstruct them for use in the URL */

            var location1, location2, location3, locations = [];

            angular.forEach(arguments, function(path) {
                locations.push(path);
            });

            return $resource(vapiURL + vapiVer + '/' + ':location1' + '/' + ':location2' + '/' + ':location3' + '/' + ':location4', {
                location1: locations[1],
                location2: locations[2],
                location3: locations[3],
                location4: locations[4],
            }, {
                'query': {
                    method: 'GET',
                    isArray: isArray
                },
                'save': {
                    method: 'POST',
                    isArray: isArray
                }
            })
        }
    };
    return factory;
}]);

这个解决方案仍然假定我将有有限的路径,这并不理想,但至少它很容易重用。

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

EN

回答 1

Stack Overflow用户

发布于 2015-03-29 07:04:01

我不明白为什么您再次从服务方法中返回诺言对象,而$resource则返回承诺本身。别干那事

代码语言:javascript
复制
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

控制器

代码语言:javascript
复制
apiService.resourceObj('/foo/bar?token=12345', true).query()
    .then(function(response) { ...do something with response });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29324296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档