【发布时间】:2014-05-18 23:05:26
【问题描述】:
我正在重构我的ngTrader 游戏,按照angularjs-google-style 将我的所有控制器、服务、指令等...定义为类,并将函数定义为这些类的原型,然后用 Angular 注册类。
问题是让这些更改与闭包库的goog.provide() 和goog.require() 一起使用。使用下面的设置,我得到一个角度错误,上面写着
Failed to instantiate module ngTrader due to:
Error: [$injector:modulerr] Failed to instantiate module ngTrader.account due to:
Error: [ng:areq] Argument 'fn' is not a function, got undefined
Index.html
<body ng-app="ngTrader">
....
<script src="bower_components/closure-library/closure/goog/base.js"></script>
<script src="components/account/accountSrvc.js"></script>
<script src="components/account/account.js"></script>
<script src="app.js"></script>
</body>
我尝试了这些文件的各种顺序,认为加载顺序会影响哪些可用,哪些不可用。我认为顺序应该无关紧要,因为这是 goog 提供/要求应该解决的问题。
- app.js、account.js、accountSrvc.js
- app.js、accountSrvc.js、account.js
- accountSrvc.js、account.js、app.js
app.js
goog.provide('ngTrader');
goog.require('ngTrader.account');
ngTrader = angular.module('ngTrader', [ngTrader.account.name]);
account.js
goog.provide('ngTrader.account');
goog.require('ngTrader.account.accountSrvc');
ngTrader.account = angular.module('ngTrader.account', []);
ngTrader.account.service('accountSrvc', ngTrader.account.accountSrvc);
不确定我是否需要在此处调用goog.require(),谷歌风格并未将其包含在他们的 sn-p 中。我试过有和没有它。我也尝试在此处添加goog.require('ngTrader'),但这会引发错误,除非我将 app.js 移动为 index.html 中的第一个调用脚本,这反过来会引发有关未定义 ngTrader.account 的错误。
服务注册在此处按照 google 风格推荐服务示例显示将 module.service('request', hello.request.Request); 放入模块定义中。
accountSrvc.js
goog.provide('ngTrader.account.accountSrvc');
ngTrader.account.accountSrvc = function() {....};
ngTrader.account.accountSrvc.prototype.reset = function() {....};
我在 accountSrvc.js 中放置了断点,并看到 ngTrader.account 对象添加了新的 accountSrvc 属性。但是当我检查 account.js 中的断点时,accountSrvc 属性是未定义的。
那么我哪里出了问题,加载脚本的顺序,我如何使用 require/provide 或其他什么?
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
我不是闭包专家,但这可能是缩小的问题。您可能需要明确定义对服务、控制器等的依赖项,因为 Angular 的依赖项注入使用参数名称来注入适当的依赖项。看看docs.angularjs.org/tutorial/step_05#a-note-on-minification。
-
@GruffBunny 我已经在 yeoman 的角度生成器之上构建了它,这会在不会缩小代码的服务任务期间出现。
标签: javascript angularjs google-closure-library