【问题标题】:Loading multiple controllers in seperate files asynchronously with angular-loader and scriptjs使用 angular-loader 和 scriptjs 在单独的文件中异步加载多个控制器
【发布时间】:2014-07-20 09:22:56
【问题描述】:

我使用 angular-seed 开始了一个 Angular 项目,并且在 index-async.html 中它默认使用 angular-loader 和 script.js。我在这个项目中添加了两个控制器,每个控制器都在两个单独的文件中。 第一个控制器的文件是这样开始的:

angular.module('myApp.controllers').controller('FirstCtrl', ...

第二个控制器的文件是这样开始的:

angular.module('myApp.controllers').controller('SecondCtrl', ...

然后在 app.js 主文件中:

angular.module('myApp.controllers', []);
angular.module('myApp', [
  'myApp.controllers'
])

三个文件都添加到 script.js 中:

$script([
      'bower_components/angular/angular.js',
      'bower_components/angular-route/angular-route.js',

      'js/app.js',

      'js/controllers/first-ctrl.js',
      'js/controllers/second-ctrl.js',
    ], function() {
      angular.bootstrap(document, ['myApp']);
    });

当我运行应用程序时,有时它可以工作,有时我会收到错误:

未捕获的错误:[$injector:nomod] http://errors.angularjs.org/1.2.20/$injector/nomod?p0=myApp.controllers

错误:[ng:areq] 参数 'FirstCtrl' 不是函数,未定义

注意。为简洁起见,我省略了 routeprovider,但我先使用 FirstCtrl 去路由。如果我改为使用 SecondCtrl 进行路由,我会遇到类似的问题。

我认为我对 angular-seed 的改变并没有太大,所以想知道添加更多控制器是否正确?

【问题讨论】:

  • 检查您的FirstCtrl 是否正确。 angular.module('myApp.controllers').controller('FirstCtrl',function($scope){}); 另请注意,您的加载器是异步的。所以它有时可以在应用初始化之前加载控制器。
  • @akn 我认为这就是 angular-loader 存在的原因 - 所以 scriptjs 可以按任何顺序加载 angular 文件。
  • @Steve 是的,以任何顺序,但有一个例外:模块声明 angular.module('myApp.controllers', []) 必须在获取模块实例之前运行 angular.module('myApp.controllers')
  • @runTarm 我只是不明白如何强制它在 app.js 文件中在其他模块之前运行angular.module('myApp.controllers', [])?如果模块不存在,有没有办法在单独的控制器文件中声明模块?
  • 您可以检查模块是否存在,然后在每个文件中创建。但是一旦模块具有依赖关系,它就会变得很麻烦,因为您需要使每个文件保持同步。顺便说一句,你真的需要异步加载吗?几乎没有必要这样做,因为我们会在推送到生产环境之前将它们全部连接并缩小到几个文件中。

标签: angularjs angular-seed


【解决方案1】:

我发现 $script.js v2(尚未发布)已经支持并行脚本加载,但也保留了执行顺序。

您可以尝试通过复制以下文件中的内容来升级它并替换index-async.html中的旧内容。

https://github.com/ded/script.js/blob/v2/src/script.js

【讨论】:

  • 感谢您迄今为止的帮助。我已经尝试在干净的角种子上再次重现该问题,但无法做到。你的意思是github.com/ded/script.js/blob/master/dist/script.js 吗? (您链接到的脚本已有 3 年历史)。我尝试了最新的脚本和同样的问题。很奇怪。
  • 不,我是指v2 分支中的代码,有关订单执行支持的讨论,请参见#19v2 尚未发布。但是看到它已经 3 岁了,所以我认为你应该开始寻找另一个支持保留执行顺序的库。可以看看LAB.jsHead.js 或进一步了解require.js
  • 另一种解决方法是将您的模块声明直接放在index-async.html 中,或者如果您不介意性能下降,只需在所有其他脚本之前同步加载app.js 并将所有模块声明在那里。
猜你喜欢
  • 2017-08-28
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多