首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将角JS $resource中的基URL参数化

将角JS $resource中的基URL参数化
EN

Stack Overflow用户
提问于 2013-11-22 10:09:41
回答 4查看 6.6K关注 0票数 10

我使用了几个角度的JS $resource定义,所有这些定义都从配置服务中检索它们的基本URL。例如:

代码语言:javascript
运行
复制
$resource(config.baseURL() + '/api/v2/foo/:id', {id: '@id'})

$resource(config.baseURL() + '/api/v2/bar/:id', {id: '@id'})

这样做的原因是,在首次加载应用程序时,可以通过查询字符串参数更改基本URL。

我发现(显然是回顾一下),$resource使用的URL只初始化一次,因此有可能在处理基本$resource查询字符串参数之前初始化特定$resource的URL的争用条件。因此,我尝试将$resource声明更改为:

代码语言:javascript
运行
复制
$resource(':baseURL/api/v2/foo/:id', {baseURL: config.baseURL(), id: '@id'})

不幸的是,基本URL正在转义-- //被转换为%2F%2F --因此整个URL无法正常工作。

有任何方法来抑制该参数的转义吗?(或者可能是解决问题的更好方法)?

EN

回答 4

Stack Overflow用户

发布于 2016-04-30 13:29:40

解决这一问题的另一种方法是使用提供程序并在配置阶段配置它。

下面是我不久前做过的类似的事情的例子。

代码语言:javascript
运行
复制
.provider('Environment', function () {
    var environments = {
        dev: {
            root: 'http://localhost',
            port: 3000,
            api: '/api',
            version: 'v1'
        }
    };
    var selectedEnv = 'dev';
    var self = this;

    this.setEnvironments = function (envs) {
        if (!Object.keys(envs).length)
            throw new Error('At least one environment is required!');

        environments = envs;
    };

    this.setActive = function (env) {
        if (!environments[env])
            throw new Error('No such environment present: ' + env);

        selectedEnv = env;
        return self.getActive();
    };

    this.getEnvironment = function (env) {
        if (!env)
            throw new Error('No such environment present: ' + env);
        return environments[env];
    };

    this.getActive = function () {
        if (!selectedEnv)
            throw new Error('You must configure at least one environment');

        return environments[selectedEnv];
    };

    this.getApiRoute = function () {
        var active = self.getActive();
        return active.root + (active.port ? ':' + active.port : '') +
            active.api + (active.version ? '/' + active.version : '');
    };

    this.$get = [function () {
        return self;
    }];
})

然后在配置阶段:

代码语言:javascript
运行
复制
.config(function (EnvironmentProvider) {

    EnvironmentProvider.setEnvironments({
        dev: {
            root: 'http://10.0.0.3',
            api: '/api',
            version: 'v1'
        },
        localonly: {
            root: 'http://localhost',
            api: '/api',
            version: 'v1'
        },
        prod: {
            root: 'https://myapp.mybackend.com',
            api: '/api',
            version: 'v1'
        }
    });

    //Set prod as the active schema
    EnvironmentProvider.setActive('prod');
});

稍后在某个控制器/服务/工厂中:

代码语言:javascript
运行
复制
.factory('API',function($resource, Environment){
 return {
  User: $resource(Environment.getApiRoute() + '/users/:id', {id: '@_id'}),
  OtherResource: $resource(Environment.getApiRoute() + '/otherresource/:id', {id: '@_id'})
 }
});
票数 2
EN

Stack Overflow用户

发布于 2014-06-29 01:15:45

为什么不使用$location服务呢?

例如,如何处理基本url,如果应用程序是从本地主机运行的,则包括端口号?另外,能够包含基于当前URL的http或https吗?

代码语言:javascript
运行
复制
var host = $location.host();
if (host === "localhost")
  host += ":" + $location.port();
var url = $location.protocol() + "://" + host + "/whateverElseYouWantInThePath";

然后在你需要的地方使用url

票数 0
EN

Stack Overflow用户

发布于 2014-10-10 15:52:18

从资源的定义来看,

  • @param {string} url一个参数化的URL模板,参数以:为前缀,如
  • /user/:username。如果您使用带有端口号的URL (例如,
  • ( http://example.com:8080/api),您需要在端口之前转义冒号字符
  • 数字,就像这样:djResource('http://example.com\\:8080/api')

因此,您必须按照以下方式定义config.baseURL():

代码语言:javascript
运行
复制
config.baseUrl = function(){
   return 'http://server.com\\:port/rest_part/';
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20142193

复制
相关文章

相似问题

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