2015-08-18 28 views
1

我正在使用angular構建單頁應用程序。我們使用持續集成與幾個DevQA環境。這意味着每次我在不同的環境中部署應用程序時,我需要更新一些配置參數,例如SPA baseUrl,休息api url或url,以供我的oauth服務器使用。

爲了實現這一點,我們的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

如果這些是依賴於config.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(...); 
}); 

否則最好的選擇是建立JSON配置到服務與Gulp/Grunt /無論。

angular.module('config', []).constant('config', <%= configJson %>); 

覺得作爲一個編譯模板,而不是「外部過程中我的應用程序修改我的源代碼」的。

1

我現在正在做的事情(但我打開更好的解決方案)是與包含所有配置信息的json對象有一個單獨的配置文件。文件內容的

例子:

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

然後我將其添加爲一個常數在我的應用程序。示例:

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

現在,您可以通過常量訪問所有配置值。不要忘記注入你的控制器等。

我希望它有幫助。

+0

感謝您的想法!我沒有考慮將它們設置爲常量,然後在我的配置階段使用。我只會補充一點,如果你將這些常量設置爲運行塊中的* $ rootContext *(例如:'$ rootScope.config = config;'),那麼它們可用於每一個控制器,從而減少了你需要明確地將它們注入到其他組件中。 – jbernal

+0

我沒有考慮過這個選項。我會試一試:)謝謝! – Tamy

相關問題