Задержка угловой инициализации приложения
У меня есть некоторые данные, которые обрабатываются в фоновом режиме асинхронно, и я хочу отложить инициализацию всего приложения 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=.