繁体   English   中英

延迟角度控制器直到Ajax调用完成

[英]Deferring angular controllers until Ajax call is completed

首先,我用Google搜索并搜索了这个问题。 我见过的所有答案都不能让我满意。 我知道解决方案和手动启动角度,对我们来说都不是很好的解决方案。

基本上我们的应用程序是这样构建的,在顶层,我们有一个

<body ng-controller="applicationController">

实例化一堆东西。 部分原因是从我们的服务器获取一些数据并进行设置,以便子控制器可以访问它。 因此,问题有时是在服务器响应之前执行子控制器。

我们使用角度UI的ui-router,这样我们就可以利用状态。 然而,对于我们来说,解决方案并不是一个很好的解决方案,因为我们有一堆路由,用户可以从任何一个进入应用程序。 到目前为止,我唯一的解决方案是创建一个非常高级的父状态并对此做出决心,或者解决多个状态。 有没有办法在角度控制器运行之前进行ajax调用?

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>

如果你想延迟控制器的实例化,你需要在某些时候利用promises$routeProvider

Misko Hevery (AngularJS的创建者)在这里回答了这样的问题: 延迟AngularJS路线改变直到模型加载以防止闪烁

他更新了“AngularJS入门教程”以符合该模式; 值得一读。

几个月前我遇到了同样的问题; 我构建了我的应用程序以遵循该原则。

基本上在应用程序中设置一个url /入口点,用于解析控制器的实例化。

如果您的应用可以从其他位置访问,请将呼叫重定向到该入口点/网址; 解析初始化后,重定向到请求的URL。

我在这里赞成了两个答案,因为在我看来,最优雅的解决方案是两者的结合(没有来回重定向)。 这个问题的核心是angular只允许通过路由提供程序对控制器参数进行同步依赖注入。 然而,我们可以将所有初始化包装在一个服务中,让我们的主控制器依赖于此。

查看此plunker进行现场演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM