4

加载我的 Angular 应用程序时,我不断收到此错误。在 Chrome 中刷新几次,我的应用程序将运行,但 IE 和 FF 不行。

该错误将我链接到此错误页面,但我真的不明白它在说什么。

我正在使用LabsJS加载我的应用程序,包括控制器和服务。

// spAppLoader.js

$LAB
    .script("../js/app.js").wait()
    .script("../js/controllers/userCtrl.js")
    .script("../js/controllers/groupCtrl.js")
    .script("../js/controllers/siteCtrl.js")
    .script("../js/services/userServices.js")
    .script("../js/services/groupServices.js")
    .script("../js/services/siteServices.js")

标记:

<div id="mdContainer" ng-app="spApp" ng-cloak>
  ...
</div>
<script type="text/javascript" src="../js/spAppLoader.js"></script>

我想发布更多代码,但我不知道从哪里开始,并且有角度的一切都在多个文件中。我是通过github上传的。

4

2 回答 2

8

您应该手动引导您的应用程序,因为您使用的是异步脚本加载器:

$LAB
    .script("../js/app.js").wait()
    .script("../js/controllers/userCtrl.js")
    .script("../js/controllers/groupCtrl.js")
    .script("../js/controllers/siteCtrl.js")
    .script("../js/services/userServices.js")
    .script("../js/services/groupServices.js")
    .script("../js/services/siteServices.js")
    .wait(function(){
      var root = document.getElementById('mdContainer')
      angular.bootstrap(root ,['spApp']);
    })

什么是自举?

angular.bootstrap(root ,['spApp']);<div id="mdContainer" ng-app="spApp">只有最后一个会在DOMContentLoaded event发生时自动初始化您的应用程序相同。

使用脚本加载器时,DOMContentLoaded event可能会在加载所有脚本之前发生,因此您必须等待所有模块脚本 ,然后手动引导您的应用程序。

DOMContentLoaded event在您的情况下,chrome 可能会缓存您的脚本,因此在加载所有脚本后发生几次刷新。

从文档:

自动初始化

Angular 在 DOMContentLoaded 事件或评估 angular.js 脚本时自动初始化,如果当时 document.readyState 设置为“完成”。此时,Angular 会寻找 ng-app 指令来指定您的应用程序根...

手动初始化

如果您需要对初始化过程进行更多控制,则可以改用手动引导方法。你需要这样做的例子包括使用脚本加载器或需要在 Angular 编译页面之前执行操作。

于 2014-01-20T01:38:56.887 回答
0

此错误通常意味着 Angular 找不到您尝试注入控制器或其他可注入函数的对象。快速浏览您的代码后,我的猜测是文件的加载方式存在问题,因为您spApp从多个文件中引用。

我通常做的是将单独的文件移动到它们自己的模块中,然后根据需要需要其他模块。例如,不要像这样启动 userService:

spApp.factory('userService', function(){

将其放入自己的模块中

angular.module('spApp.services.user', [])
    .factory('userService', function(){

然后,每当您需要在另一个模块中使用 userService 时,将其添加为需求。例如:

var spApp = angular.module('spApp', ['spApp.services.user']);

于 2014-01-20T01:20:58.823 回答