我正在重构我的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
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()
这里的调用,谷歌风格不包括它们的片段。我曾经尝试过没有它。我也试过在这里添加goog.require('ngTrader')
,但这会引发错误,除非我将app.js移动到index.html中的第一个被调用的脚本,这反过来会抛出关于未定义的ngTrader.account的错误。 / p>
此处按照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,或其他什么?
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
以下是否有帮助?
<body ng-app="ngTrader">
<script src="bower_components/closure-library/closure/goog/base.js"></script>
<script>
goog.require("ngTrader");
</script>
</body>
确保设置js / libraries / goog / deps.js中的路径,否则可以使用calcdeps设置它们:
python \
"/home/me/Software/Programming/JavaScript/Closure compiler/closure-library/closure/bin/calcdeps.py" \
--path /var/www/html/hosts/site/public_html/js/libraries \
--input /var/www/html/hosts/site/public_html/js/libraries/app.js \
--output_mode deps \
--output_file /var/www/html/hosts/gsa/public_html/js/libraries/goog/deps.js
文件的位置和名称可能很重要,因为calcdeps会在具有特定名称的特定位置期望它们。你可以通过添加--input(我认为)来改变它,而是使用结构化路径。有关示例,请参阅here:
<强> [更新] 强>
我可以运行未编译的代码,文件位于:
谷歌闭包库位于:public_html / js / libraries / goog
Angular in:public_html / js / libraries / angular.1.0.8.js
的public_html / JS /库/ app.js
的public_html / JS /库/ ngTrader / account.js
的public_html / JS /库/ ngTrader /帐户/ accountSrvc.js
的public_html /的test.html
<body ng-app="ngTrader">
<script src="js/libraries/angular.1.0.8.js"></script>
<script src="js/libraries/goog/base.js"></script>
<script>
goog.require("ngTrader");
</script>
</body>
必须使用以下命令创建deps.js:
python \
"/path/to/closure-library/closure/bin/calcdeps.py" \
--path /path/to/public_html/js/libraries \
--input /path/to/public_html/js/libraries/app.js \
--output_mode deps \
--output_file /path/to/public_html/js/libraries/goog/deps.js