Извлекать настройки сервера после boostrap, но перед чем-либо еще

#angularjs #asynchronous #angularjs-scope #angularjs-rootscope #angularjs-bootstrap

#angularjs #асинхронный #angularjs-область #angularjs-rootscope #angularjs-bootstrap

Вопрос:

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

В моем приложении anguarJS я хочу убедиться, что самое первое, что после загрузки / загрузки AngularJS, отправляется на сервер через $http и извлекает некоторые настройки (вызывая api: /api/settings/get ) — в зависимости от поддомена и / или наличия JWT или другого пользовательского сеанса, он будетизвлеките некоторые данные настроек, которые следует добавить в $rootScope .

Моя проблема заключалась в том, что я не смог «остановить» приложение и продолжить его повседневную жизнь только тогда и только тогда, когда настройки были извлечены и заполнены $rootScope . Если вызов fetch или settings может упасть, приложение должно «остановиться» — поэтому очень важно, чтобы эти настройки загружались очень рано, Чтобы я знал, что все (службы, контроллеры, директивы и т. Д.) Имеют к ним доступ.

Я пробовал с $broadcast помощью event и вставил его в свою .run функцию в angular, но, похоже, он все еще разрешает приложение (возможно, очевидно, потому что оно асинхронное).

 apiConnector.get('api/settings/get').then(function(settings) {
  $rootScope.settings = settings;
  $rootScope.$broadcast('settings-fetched');
});
  

Однако мне не нравится этот подход, и он требует, чтобы я везде прослушивал это событие.

Мои маршруты являются общедоступными и ограниченными.

Я надеюсь, что кто-нибудь может помочь мне в правильном направлении, как я мог бы решить эту проблему.

Комментарии:

1. Вы случайно не используете ui-router в своем приложении? Если это так, решение может быть хорошим решением.

2. Привет, Эрик, я забыл эту деталь. Да, я использую ui.router в своем проекте. Как бы я мог использовать разрешение для этого? Я пробовал это некоторое время назад, но безуспешно

Ответ №1:

Поскольку вы используете ui-router, я предлагаю использовать resolve перед входом в состояние по умолчанию: https://github.com/angular-ui/ui-router/wiki#resolve

Пример конфигурации маршрута из ui-router docs:

 $stateProvider.state('myState', {
      resolve:{
         // Example using function with returned promise.
         // This is the typical use case of resolve.
         // You need to inject any services that you are
         // using, e.g. apiConnector in this example
         settingsObj:  function(apiConnector){
            return apiConnector.get('api/settings/get');
         }
}
  

Если этот get завершается неудачно, вы можете обработать это в разрешении, используя .then() для перенаправления пользователя из приложения или w / e. Как и в случае с обычными обещаниями в angular.