【问题标题】:angularjs - how to reference value defined in same moduleangularjs - 如何引用在同一模块中定义的值
【发布时间】:2014-12-04 22:44:19
【问题描述】:

我正在编写一个包含两个 .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 方法进行比较 - 一定有比这更简洁的方法!?

【问题讨论】:

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


    【解决方案1】:

    您是否尝试过将 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/',
            });
    

    【讨论】:

    • 谢谢,但这似乎不起作用 - 请参阅我刚刚添加的 jsfiddle - 链接用于原始代码,但是当我添加您的更改时,它会破坏“配置”模块
    【解决方案2】:

    据我所知,您不能将值依赖注入另一个值。您可以使用服务或工厂来构建您的 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;
        }
    }}]);
    

    【讨论】:

    • 感谢 Gaurav - 我实际上只是想将第二个 .value 配方转换为工厂 - 请参阅 jsfiddle.net/goredwards/xvj5xcgz - 与可以连接到现有的 pure_js 方法相比,这一切似乎相当冗长声明变量
    【解决方案3】:

    正如 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 似乎很奇怪...

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2014-11-02
      • 2014-06-16
      • 1970-01-01
      • 2014-07-22
      • 2017-05-14
      • 2015-02-18
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多