Задержка угловой инициализации приложения

У меня есть некоторые данные, которые обрабатываются в фоновом режиме асинхронно, и я хочу отложить инициализацию всего приложения Angular до тех пор, пока это не будет завершено.

BackgroundData.initialized является обещанием Q, так что-то вроде этого:

BackgroundData.initialized.then(AngularDoYoStuff)

Проблема, с которой я сталкиваюсь, заключается в том, что контроллер домашней страницы запускает процедуру инициализации, обращается к BackgroundData и либо имеет неправильные данные, либо их нет.

В какую функцию я могу обернуть инициализацию Angular так, чтобы вместо готовности к dom она ждала как dom-ready, так и BackgroundData.initialization?

ОБНОВИТЬ

Я стал ближе с документацией по ручной загрузке:

angular.element(document).ready ->
  setupGA()
  window.BackgroundData = new DataMachine()
  BackgroundData.initialized.then ->
    angular.bootstrap(document)

Но когда загружаются файлы контроллера (после этого файла), они все еще инициализируются до определения BackgroundData

ОБНОВЛЕНИЕ 2

Удаление ng-app Директива в HTML, кажется, устранила проблему (так как это говорило Angular авто-инициации), но теперь она просто игнорирует все мои angular.module звонки

3 ответа

Решение

Проблема заключалась в том, что я оставил ng-app директива в теге html, которая сообщает Angular об автоматической инициализации этой области. Удаление его позволило моей ручной инициализации работать правильно.

Как упоминал Крис, это можно сделать с помощью angular.bootstrap без упоминания ng-app:

<div id="appArea" ng-controller="someCtrl">
  {{name}}
</div>

    <script>
    angular.module('someApp', [])
    .controller('someCtrl', function($scope) {
      $scope.name = "test name";
    })
    setTimeout(function() {
      angular.bootstrap(document, ['someApp']);
    }, 2000);
  </script>

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

Т.е. предоставить удобное сообщение "загрузка", а затем загрузить функциональность.

Вы можете ввести $route где требуется, а затем вызвать что-то вроде:

$route.routes["/RouteName/:param"] = {templateUrl:"template.html", reloadOnSearch:true, controller:"ControllerName"};

После этого позвоните $route.reload() или же $rootScope.apply() обновить.

Дополнительная информация по адресу https://groups.google.com/forum/?fromgroups=.

Другие вопросы по тегам