angularjs - 如何引用同一模块中定义的值

时间:2014-12-04 22:44:20

标签: angularjs android-contentprovider angularjs-service angularjs-module

我正在编写一个包含两个.value配方的配置模块:

  • 基本URL
  • 许多REST api网址,它们位于baseURL
  • 之上

我目前将它们设置为.value,但它们可以很容易地成为.constant

由于我希望能够在不必重写所有API网址的情况下更改baseURL,我需要引用我刚刚定义的baseURL - 在同一个模块中:

var configuration = angular.module('configuration', []); 

configuration.value('Config',{
    baseURL : 'http://dev.mysite.com/',     // define Base URL
});

configuration.value('ApiList', {
    getMyDataLink1 : this.baseURL + 'rest/folder1/action1/api_key/',
    getMyDataLink2 : this.baseURL + 'rest/folder2/action2/api_key/',
    getMyDataLink3 : this.baseURL + 'rest/folder3/action3/api_key/',
});

当我测试变量时:

  • Config.baseURL正确输出http://dev.mysite.com/
  • ApiList.getMyDataLink1只定义了一半,因为this.baseURL部分未定义(即输出undefinedrest/folder1/action1/api_key/

我也尝试将ApiList .value定义为:

getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/', 
//or
getMyDataLink1 : baseURL + 'rest/folder1/action1/api_key/', 

但是其中任何一个都会出现“Uncaught ReferenceError:XXXX未定义”错误...

是否可以从同一模块中的另一个.value引用.value?

编辑: 见http://jsfiddle.net/goredwards/yy5xuodh/

EDIT2:见http://jsfiddle.net/goredwards/xvj5xcgz/我将第二个.value转换为.factory - 然后与小提琴底部的js-only方法进行比较 - 必须有一个比这更简洁的方法! ?

3 个答案:

答案 0 :(得分:0)

您是否尝试过将Config注入ApiList?

     configuration.value('ApiList', function(Config) {
           getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/',
           getMyDataLink2 : Config.baseURL + 'rest/folder2/action2/api_key/',
            getMyDataLink3 : Config.baseURL + 'rest/folder3/action3/api_key/',
        });

答案 1 :(得分:0)

据我所知,你不能将值依赖注入另一个值。您可以使用服务或工厂来构建API网址。像这样:

   configuration.value('Config',{
    baseURL : 'http://dev.mysite.com/',     // define Base URL
});

configuration.value('ApiList', {
    getMyDataLink1 : 'rest/folder1/action1/api_key/',
    getMyDataLink2 : 'rest/folder2/action2/api_key/',
    getMyDataLink3 : 'rest/folder3/action3/api_key/',
});

app.service('URLService', ['Config', 'ApiList', function(Config, ApiList){
    return {
    getURLs : function() {
        var url = Config.baseURL+ApiList.getMyDataLink1;
        return url;
    }
}}]);

答案 2 :(得分:0)

正如Gaurav所指出的那样,似乎不可能在.value配方中注入任何东西,所以我发现最简洁最清晰的方法(从可维护性的角度来看)是转换连接的.value配方(即第二个)进入.factory食谱并注入“配置”。 .value变量:

var configuration = angular.module('configuration', []); 

configuration.value('Config',{
    baseURL : 'http://dev.mysite.com/',     // define Base URL
});

configuration.factory('ApiList', ['Config', function(Config){
    return{
        getMyDataLink1 : Config.baseURL + 'rest/folder1/action1/api_key/',
        getMyDataLink2 : Config.baseURL + 'rest/folder2/action2/api_key/',
        getMyDataLink3 : Config.baseURL + 'rest/folder3/action3/api_key/'
    };
}]);

虽然这有效(见http://jsfiddle.net/goredwards/xvj5xcgz/),但相对简洁&很明显,似乎很奇怪.values不能简单地连接到其他.values ......