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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $