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

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

    }]);

ИЗМЕНИТЬ1

Итак, основываясь на предложениях ниже, я собираюсь объявить постоянный подход. В основном у меня будет отдельный файл 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?

})

person LP13    schedule 20.04.2016    source источник
comment
Константа не обязательно должна быть строкой. Это может быть что угодно. Удалите кавычки вокруг значения: {Const1: "someValue", ...}, а не '{Const1: "someValue", ...}'   -  person JB Nizet    schedule 20.04.2016


Ответы (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}'

?

person MarcoS    schedule 20.04.2016

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

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

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();
   });
person Eugene Korobov    schedule 20.04.2016
comment
Благодарю. Это может сработать. Однако я решил пойти с постоянным подходом. - person LP13; 20.04.2016

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

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

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

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

person JB Nizet    schedule 20.04.2016