AngularJS, загрузка конфига перед запуском приложения?

Здравствуйте! Кратко опишу ситуацию: есть проект, есть клиент, есть сервер. Проект разрабатывают разные люди, все синхронизируется через GIT. В проекте есть конфиг файл в котором содержатся URL для запросов к API. Для нормальной разработки нужно два конфига - с одним (client.config.json: где все url запросов к API сервера заменены на URL статичных JSON файлов) работает fron-end разработчик, с другим (server.config.json: где url как и должны быть - реальные url серверного API) работает другой разработчик. Ну и чтобы вся эта кухня работала есть один общий конфигрурационный файл (config.json), где указано какой из двух конфигов грузить angular-приложению. Сделано это для нормальной работы с GIT, чтобы каждый раз можно было ничего не менять и файл config.json не коммитить.

Возник такой вопрос: я хотел загружать конфиги как сервис-константу в angular:
var app = angular.module(...)
app.constant('ENV',config);


Но мне необходимо, чтобы конфиг загрузился до других модулей\сервисов\итд. Погуглив, я решил сделать resolve в конфигурации $routeProvider:
$routeProvider.when('/home', {
            templateUrl: 'partials/home.html',
            controller: 'HomePageCtrl',
            activeTab: 'home',
            resolve: { loadConf: loadEnvironmentConfig }
});


Функция loadEnvironmentConfig - загружает конфиг по вышеназванному алгоритму:
var loadEnvironmentConfig = function ($http) {
        return $http.get('./config.json').then(function (resData) {
            return $http.get('./'+resData.data.ENV+'.config.json').then(function (configData) {
                var environmentConfig = {
                    NAME: resData.data.ENV,
                    CONFIG: angular.extend({},configData.data)
                };
                app.constant('ENV',environmentConfig); // Тут возникают проблемы
            });
        });
    };


Но я столкнулся с одной неприятной проблемой: сервисы начинают инициализироваться до того, как сработает эта конструкция и инжектор зависимостей выдает ошибку, что модуль ENV не найден:
app.factory('Image', [ '$resource', 'ENV', function ($resource,ENV) {
        return $resource(ENV.CONFIG.Image.url, {}, {
            query: {method:'GET', params:{phoneId:'all'}, isArray:true}
        });
    }]);


Это можно как-нибудь исправить?

Я сделал так: вместо константы определил ENV как value:
app.value('ENV',{});

И загружаю его вот так:
var loadEnvironmentConfig = function ($http,ENV) {
        return $http.get('./config.json').then(function (resData) {
            return $http.get('./'+resData.data.ENV+'.config.json').then(function (configData) {
                var environmentConfig = {
                    NAME: resData.data.ENV,
                    CONFIG: angular.extend({},configData.data)
                };
                angular.extend(ENV,environmentConfig);
            });
        });
    };


Этот код запускается без ошибок, но мне не нравится, что ENV - не константа. Подскажите, можно ли как-нибудь сделать вариант с константой? Или может есть более адекватные способы для загрузки конфигурации?
Заранее спасибо.
  • Вопрос задан
  • 5025 просмотров
Решения вопроса 1
maxaon
@maxaon
Наиболее простым способом будет не использовать автоматический бутстрап ангуляра:
1. Загрука конфига (либо через XMLHttpRequest, либо через Jquery)
2. Обработка конфига, регистроирование константы.
3. Бутстрап ангуляра.

Простой пример jsbin.com/vanoliyo/2/edit

Но более правильным способом будет путь минимизации запросов к серверу, чтобы не приостанавливать бутстрап приложения и не ждать двух последовательных запросов. Как это сделать - сногое зависит от окружения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Но мне необходимо, чтобы конфиг загрузился до других модулей\сервисов\итд

Неверно. Angular имеет ленивую подгрузку модулей. Запуску приложения предшествует этап конфигурации, при котором все сервис провайдеры, контанты и прочее уже будут запущены.

Ваша проблема в том, что вы загружаете конфиг уже после этапа настройки, вам нужно настроить сборщик, что бы он подставлял модуль с конфигом в зависимости от окружения.

У меня схожая система хранения конфигов - просто сделал таск для сборки под определенное окружение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы