首先,我用Google搜索并搜索了这个问题。我见过的所有答案都不能让我满意。我知道决心和手动引导角度,对我们来说都不是很好的解决方案。
基本上我们的应用程序是这样构建的,在顶层,我们有一个
<body ng-controller="applicationController">
实例化一堆东西。部分原因是从我们的服务器获取一些数据并进行设置,以便子控制器可以访问它。因此,问题有时是在服务器响应之前执行子控制器。
我们使用角度UI的ui路由器,因此我们可以利用状态。然而,对于我们来说,解决方案并不是一个很好的解决方案,因为我们有一堆路由,用户可以从任何一个进入应用程序。到目前为止,我唯一的解决方案是创建一个非常高级的父状态并对此做出决心,或者解决多个状态。有没有办法在角度控制器运行之前进行ajax调用?
答案 0 :(得分:2)
ng-include(http://docs.angularjs.org/api/ng.directive:ngInclude)怎么样?从html文件中删除所有子控制器内容并将其放在模板文件中。现在您可以从服务器加载一些数据,如果它们都已到达,则设置ng-include src。
使用此解决方案,您还可以在加载阶段显示另一个模板文件。
如果您不希望将您的内容放在另一个文件中,您可以考虑编写一个可以处理内联模板的指令:
<script type="text/ng-template" id="my-awesome-content.html">
...
</script>
答案 1 :(得分:2)
如果您想延迟控制器的实例化,则需要在某个时候利用promises
和$routeProvider
。
Misko Hevery (AngularJS的创建者)在这里回答了这样的问题:Delaying AngularJS route change until model loaded to prevent flicker
他更新了“AngularJS入门教程”以符合该模式;值得一读。
几个月前我遇到了同样的问题;我构建了我的应用程序以遵循这一原则。在您的应用中基本设置一个解决控制器实例化的网址/入口点。
如果您的应用可以从其他位置访问,请将呼叫重定向到该入口点/网址;解析初始化后,重定向到请求的URL。
答案 2 :(得分:2)
我赞成这两个答案,因为在我看来,最优雅的解决方案是两者的结合(不会来回重定向)。这个问题的核心是angular只允许通过路由提供程序对控制器参数进行同步依赖注入。然而,我们可以将所有初始化包装在一个服务中,让我们的主控制器依赖于此。
请参阅this plunker了解即时演示。