Как получить значения конфигурации с сервера в Angular?

Мое приложение нуждается в некоторых значениях конфигурации при запуске приложения. Предложения сообщества - хранить их как константы в виде отдельного модуля, предпочтительно в отдельном файле.js. Это может работать для меня.
Однако мои значения конфигурации также хранятся на сервере, и я не хочу дублировать их на стороне клиента, поэтому я подумал сделать серверный вызов, чтобы получить их.
Я новичок в angular, это допустимая практика проектирования, чтобы сделать вызов сервера в методе config модуля? Если да, то я должен просто использовать службу $http, чтобы получить значения с сервера?

    var main = angular.module('myapp', ['AdalAngular']);

    main.config(['$stateProvider',$httpProvider, adalAuthenticationServiceProvider', function ($stateProvider,$httpProvider,adalProvider) {

        // $stateProvider configuration goes here

        // ?????CAN I make server call here to get configuration values for adalProvider.init method below???

        adalProvider.init(
            {
                instance: 'someurl', 
                tenant: 'tenantid',
                clientId: 'clientid',
                extraQueryParameter: 'someparameter',
                cacheLocation: 'localStorage',
            },
            $httpProvider
            );

    }]);

    main.run(["$rootScope", "$state", .....
        function ($rootScope, $state,.....) {

            // application start logic

        }]);


    main.factory("API", ["$http", "$rootScope", function ($http, $rootScope) {

        // API service that makes server call to get data

    }]);

EDIT1

Итак, основываясь на предложениях ниже, я собираюсь объявить постоянный подход. В основном у меня будет отдельный файл config.js, и в процессе развертывания я перезаписываю файл config.js соответствующим файлом config.js для среды.

Вопрос
Если есть до 10 констант, то я должен передать их отдельно в module.config(). Можно ли объявить постоянное значение как объект JSON и как-то прочитать его в функции конфигурации, чтобы у меня не было 10 различных параметров?

angular.module('myconfig', [])
            .constant('CONFIGOBJECT','{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}');

и тогда как мне прочитать значения в методе конфигурации?

var main = angular.module('myapp',['myconfig']);
main.config(['CONFIGOBJECT',function(CONFIGOBJECT){

 ?? How do I read CONFIGOBJECT value that is a string not json object?

})

3 ответа

Решение

Вы не можете внедрить услугу в config раздел.
Вы можете добавить услугу в run раздел.

Таким образом, вы не можете использовать, например, $http сервис для извлечения данных с сервера внутри config(), но вы можете сделать внутри run(), который инициализирует сервис провайдера.

Смотрите также более полный ответ здесь.

Надеюсь это поможет.

ОБНОВЛЕНИЕ:

Зачем string? Почему бы вам просто не использовать

.constant('CONFIGOBJECT', {Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}

за

.constant('CONFIGOBJECT', '{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}'

?

Я опишу решение, используемое в проекте, над которым я работал некоторое время назад.

Это правда, что вы не можете использовать сервисы на этапе конфигурирования, а также то, что вы можете использовать провайдеры и константы на этапе конфигурирования. Поэтому мы использовали следующее решение: во-первых, мы создали простой объект с конфигурацией, как

var config = {
    someConfig1: true,
    someConfig2: false,
    someConfigEvents: {
        event1: 'eventConfig1',
        event2: 'eventConfig2'
    }
    etc...
}

Затем мы также объявили угловое значение с помощью jQuery lib:

app.value('jQuery', jQuery);

И теперь мы не можем использовать такие сервисы, как $http, но мы можем использовать jQuery, поэтому мы просто вызываем ajax на сервер конфигурации и расширяем нашу конфигурацию:

jQuery.ajax("path/to/config", { async: false, cache: false })
   .done(function (data) {
      var response = angular.fromJson(data)
      if (response) {
         angular.extend(config, response.returnData.data);
      } else {
         alert('error');
      }
   })
   .fail(function () {
      alertError();
   })
   .always(function () {
      appInit();
   });

На этапе настройки доступны только поставщики, а не службы. Таким образом, вы не можете использовать $ http на этом этапе.

Но вы можете использовать его на этапе выполнения (в функции, переданной run()).

Альтернативой является создание некоторого файла JavaScript, динамически генерируемого сервером и определяющего нужные вам константы.

Другой альтернативой является создание такого JS-файла во время сборки на основе некоторого файла, который будет считан кодом на стороне сервера.

Другие вопросы по тегам