AngularJS:如何在配置阶段使用$ http

时间:2015-08-18 10:40:33

标签: javascript angularjs

我正在使用angular构建单页面应用程序。我们使用持续集成与几个 Dev QA 环境。这意味着每次我在不同的环境中部署应用程序时,我都需要为我的oauth服务器更新一些配置参数,例如SPA baseUrl,rest api url或url。

为实现这一目标,我们的CI引擎会在我们即将部署时为每个环境生成一个config.json文件,其中包含正确的参数。为此,我创建了一个非常简单的服务:

(function () {
  'use strict';

  angular
    .module('app.core')
    .factory('config', config);

  config.$inject = ['$http'];

  function config($http) {
    return {
      load: load
    };

    //////////

    function load() {
      return $http.get('assets/config/config.json');
    }
  }
}());

我的大部分服务都是在配置阶段期间通过提供商配置的。这就是问题出现的地方。如您所知,在此阶段无法注入服务,但我想使用 config 服务为我的提供商设置正确的URL和参数。

有没有正确的方法呢?

到目前为止,我唯一可以考虑的是将这些配置参数嵌入到我的模块创建文件中,以便它们可以随时使用。这似乎很难看,因为我不希望任何外部进程来修改我的源代码。

2 个答案:

答案 0 :(得分:2)

如果这些是依赖于config.json的异步服务,那么完全可以改变它们的配置方式并使配置适合异步工作流,例如。

library(RcppRoll)
DT[, sales_rolling2 := c(sales[1L], roll_sum(sales, 2)), by = .(indx, item)]

否则,最好的选择是使用Gulp / Grunt / no将json配置构建到服务。

想想

app.factory('config', function ($http) {
  return $http.get('config.json', { cache: true })
    .then(function (response) {
      return response.data;
    });
});

app.factory('asyncService', function ($http, config) {
  return config.then(function (config) {
    return $http...
  }).then(...);
});

从编译模板开始,而不是“我的应用程序修改源代码的外部流程”。

答案 1 :(得分:1)

我目前正在做的事情(但我是开放的更好的解决方案)是使用包含所有配置信息的json对象的单独配置文件。

文件内容示例:

var appConfigInfo = {
    DEV: true,
    API_PATH: 'your_custom_url'
    // etc.
};

然后我在我的应用中将其添加为常量。例如:

angular
    .module('app', [])
    .constant('APP_CONFIG', appConfigInfo);

现在您可以通过常量访问所有配置值。不要忘记将它注入控制器等等。

我希望它有所帮助。