将 angularjs 控制器拉出到不同的文件中时,如果我的模块没有首先加载怎么办?

Posted

技术标签:

【中文标题】将 angularjs 控制器拉出到不同的文件中时,如果我的模块没有首先加载怎么办?【英文标题】:When pulling angularjs controllers out into different files, what if my module doesn't load first? 【发布时间】:2014-07-31 19:01:18 【问题描述】:

当我的模块无法加载时,如何正确加载它?

假设我有几十个控制器,我想将每个控制器分成自己的文件。对于这个例子,假设我有一个控制器存在于一个文件中:controller.js

angular.module('pubmodule').controller( 'CreatePostController', ['$stateParams', '$scope','$http' ,function($stateParams, $scope, $http) 
        ]);

我有一个从以下位置加载的模块:base.js

angular.module( 'pubmodule', ['ngSanitize', 'ionic'] )
.run( function ( $rootScope, $state, $stateParams, PostTimelineService)  );

我从我的 html 加载这些文件:

<script type="text/javascript" src="controller.js"></script>
<script type="text/javascript" src="base.js"></script>

当我按上述顺序加载文件时,我无法访问 pubmodule 所以我看到:

Error: [ng:areq] Argument 'CreatePostController' is not a function, got undefined

我密切关注this question,但是这个问题没有考虑加载顺序,这是我感兴趣的主题。如何将我的控制器分成不同的文件并考虑我的模块加载顺序?只需更改我的 html 加载顺序即可解决此错误,但我担心在考虑延迟时我无法控制此错误。对 controller.js 的请求可能会先回来。

【问题讨论】:

延迟与加载顺序无关。浏览器仍将加载在 html 中声明的文件。因此,只要首先引用您的 base.js 文件就可以了。浏览器将按照它们出现的顺序执行代码。因此,如果控制器在 base 之后声明但首先下降,则在 base 完成之前不会对其进行评估。 当使用脚本标签(不带异步)时,它将按照在 html 中出现的顺序加载。延迟不会导致脚本不同步。 Its well explained in this answer 好问题。我自己在处理一个项目的 requireJS ,我们如何订购和组合 Javascript 文件变得很棘手。附带说明一下,我认为我们的编程模型不应该依赖于这些语义,并且结合所有应用程序的 Angular 代码是使用 Grunt/Yeoman 工作流程的最佳选择。 @HattanShobokshi 如果您回答上述问题,我会接受。我忘了这个。 谢谢,我把它作为答案发布了。 【参考方案1】:

延迟与加载顺序无关。浏览器仍将加载在 html 中声明的文件。因此,只要首先引用您的 base.js 文件就可以了。浏览器将按照它们出现的顺序执行代码。因此,如果控制器在 base 之后声明但首先下降,则在 base 完成之前不会对其进行评估。

【讨论】:

【参考方案2】:

我的选择是在 base.js 中的 controller.js 之后发生的 module.run()。

附带说明,如果 base.js 真的是基础,它应该位于 controller.js 的顶部。

尽管如此,尝试在第一个 js 中添加您的 .run。但也要确保它的所有依赖项在此之前都是可用的......例如您的 PostTineLineService。

查看 AngularJS 文档关于其依赖项的运行顺序。

enter link description here

【讨论】:

以上是关于将 angularjs 控制器拉出到不同的文件中时,如果我的模块没有首先加载怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

在 AngularJS 服务中处理数据绑定

AngularJS --> ng-view 不加载 js

通过 AngularJS 将多个文件上传到 Laravel 控制器

如何将文件夹中包含的控制器动态绑定到angularjs中的视图

不同选项卡中控制器之间的Angularjs通信[重复]

将复选框列表传递到视图中并拉出 IEnumerable [重复]