#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.