1

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

  • 基本网址
  • 位于 baseURL 之上的许多 REST api URL

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

因为我希望能够更改 baseURL 而不必重写所有 API url,所以我需要引用我刚刚定义的 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/', 

但其中任何一个都会给出“未捕获的 ReferenceError:未定义 XXXX”错误...

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

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

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

4

3 回答 3

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/',
        });
于 2014-12-04T22:59:03.727 回答
0

据我所知,您不能将 value 依赖项注入另一个 value 。您可以使用服务或工厂来构建您的 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;
    }
}}]);
于 2014-12-05T00:17:19.530 回答
0

正如 Gaurav 指出的那样,似乎不可能将任何东西注入 .value 配方,所以我发现的最短和最清晰的方法(从可维护性的角度来看)是将连接的 .value 配方(即第二个)转换为.factory 配方并注入 'Config' .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 似乎很奇怪......

于 2014-12-05T05:23:18.370 回答