Как получить значения конфигурации с сервера в 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-файла во время сборки на основе некоторого файла, который будет считан кодом на стороне сервера.