谷歌闭包库和angularjs的问题

时间:2014-04-06 21:00:21

标签: javascript angularjs google-closure-library

我正在重构我的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()这里的调用,谷歌风格不包括它们的片段。我曾经尝试过没有它。我也试过在这里添加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,或其他什么?

任何帮助将不胜感激。感谢。

1 个答案:

答案 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