如何延迟AngularJS App初始化?

时间:2013-03-12 17:41:35

标签: asynchronous angularjs promise

我有一些数据正在后台异步处理,并希望延迟整个AngularJS应用程序的初始化,直到完成为止。

BackgroundData.initialized是一个Q承诺,所以像这样:

BackgroundData.initialized.then(AngularDoYoStuff)

我遇到的问题是主页的控制器启动其初始化过程,命中BackgroundData并且它有错误/没有数据。

我可以用什么函数包装Angular的初始化,而不仅仅是dom-ready,它等待dom-ready和BackgroundData.initialization?

更新

我更接近manual bootstrapping上的文档:

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

但是当控制器文件加载时(在此文件之后),它们仍然在定义BackgroundData之前被初始化

更新2

删除HTML中的ng-app指令似乎解决了问题(因为这会告诉Angular自动初始化),但现在它只是忽略了我的所有angular.module次调用

3 个答案:

答案 0 :(得分:9)

问题是我在html标记中留下了ng-app指令,它告诉Angular自动初始化该范围。删除它允许我的手动初始化正确运行。

答案 1 :(得分:2)

正如Chris所说,可以使用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>

答案 2 :(得分:0)

如果您在应用中使用路线,解决此问题的一种方法是让应用初始化,但等待定义路线,直到数据可用。

即。提供用户友好的“加载”消息,然后在之后加载功能。

您可以在必要时注入$route,然后调用类似的内容:

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

之后,请致电$route.reload()$rootScope.apply()进行刷新。

https://groups.google.com/forum/?fromgroups=#!msg/angular/AokZpUhZ6mw/x2kPIN2VAC0J

的更多信息