Подтвердить что ты не робот

Как дождаться обещания в блоке 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"]);
    })
})
4b9b3361

Ответ 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