Как дождаться обещания в блоке Run в Angular?
Мне действительно нужны некоторые данные для загрузки перед загрузкой angular. По этой причине я создал блок run
/В этом блоке run
я вызываю метод в службе, которая загружает некоторые данные с сервера. Поскольку это асинхронный вызов, JavaScript получает дальнейшее выполнение, что приводит к некоторым объектам undefined в моем приложении.
Я работаю с маршрутами, но это не вариант работы с свойством resolve
.
Может ли кто-нибудь предоставить решение о том, как ждать обещания быть готовым в блоке run
?
EDIT:
Благодаря данным ответам, я решил его вручную загрузить angular:
$(document).ready(function () {
$.ajax('/Data/GetDropdownData', {type:'POST'}).done(function (response) {
app.run(['ListService', function (ListService) {
ListService.setData(response);
}])
angular.bootstrap(document, ["sma"]);
})
})
Ответы
Ответ 1
Как я прокомментировал, добавьте его здесь
Вы можете попробовать ручную загрузку
<script>
angular.element(document).ready(function() {
angular.bootstrap(document);
});
</script>
В этом случае вы не можете использовать контроллеры и angular способ получения данных. Я думаю, вам придется загружать данные jQuery, загружать ваш angular в обратном вызове jquery, а затем инициализировать переменную области видимости с данными, полученными из jquery.
Ответ 2
Вы можете посмотреть this SO question - он показывает, как инициализировать услугу AngularJS с асинхронными данными.
Здесь - пример plunkr из этого вопроса, показывающий использование служб AngularJS, таких как $http, для загрузки конфигурации, а затем дальнейшая инициализация.
Этот ответ имеет большое объяснение и показывает пример ожидания загрузки DOM таким образом (пример plunkr из этого ответа здесь):
angular.element(document).ready(function() {
angular.bootstrap(document);
});
Ответ 3
Я предполагаю, что единственным решением является вручную загружать ваше приложение. Возможно, вы можете найти некоторую помощь в этом вопросе Delay Angular Инициализация приложений и в этой небольшой статье Ручная загрузка AngularJS для асинхронной загрузки в Internet Explorer.
Как указано в предыдущей статье, выполните ручную загрузку:
angular.element(document).ready(function() {
angular.bootstrap(document, ["myApp"]);
});
Обязательно удалите все рефракции ng-app
в HTML
, чтобы остановить автоматическую загрузку.
Ответ 4
другое решение, так как я не буду опускать части своего приложения, но мне все равно придется ждать загрузки вещей.
директива bootstrap (не связанная с загрузкой twitter):
myApp.directive('myBootstrap', function() {
return {
scope: {
promise: '=myBootstrap'
},
template: '<div ng-if="ctrl.isReady" ng-transclude></div>',
controllerAs: "ctrl",
transclude: true,
controller: function($scope) {
var ctrl = this;
ctrl.isReady = false;
//else an array of promises can be filled by a service
$scope.promise.then(function() {
ctrl.isReady = true;
});
}
};
});
и связанный с ним plnkr: http://plnkr.co/edit/vx4aWS?p=preview