在Require.js完成设置配置后执行javascript脚本

时间:2014-01-23 15:23:26

标签: jquery cordova requirejs

我正在创建一个Phonegap应用。我正在使用Require.js并正在实现推送通知。在我的index.html文件中,我有:

<script data-main="js/app" src="js/require.js"></script>

<script type="text/javascript" src="js/app/index.js"></script>
<script type="text/javascript">
    app.initialize();
</script>

app.js定义Require.js模块的基本URL并启动路由器。 Index.html定义“deviceready”监听器。问题是在index.js中,我需要对Require.js模块进行压缩,例如Jquery。但是,例如,在index.js中,如果我这样做:

initialize: function() {

    require(["jquery"], function () {

    });
},

我收到错误:

Uncaught Error: Script error for: jquery
http://requirejs.org/docs/errors.html#scripterror at file:///android_asset/www/js/require.js:8
Uncaught Error: Load timeout for modules: backbone
http://requirejs.org/docs/errors.html#timeout at file:///android_asset/www/js/require.js:8

我认为这是因为在app.js仍在设置路径等时调用了index.js.我需要在app.js完成后执行index.js。我不能用:

    $(document).ready(function() {
        app.initialize();
    });

因为Jquery作为模块加载,所以会抛出错误。我也无法将index.js作为模块加载,因为我在另一个SO问题here中写了一个问题。

任何想法我能做什么?

2 个答案:

答案 0 :(得分:2)

如果您使用单独的<script>标记而不是data-main加载主文件,那么您的RequireJS配置将立即运行:

<script src="js/require.js"></script>
<script src="js/app.js"></script>

这可能会有问题,具体取决于js/app.js包含的内容。如果它导致问题,那么您可以将此文件拆分为a)仅包含RequireJS配置的文件(让我们称之为js/requirejs-config.js),b)适当的应用程序(仍然称为js/app.js)。如下所示:

<script src="js/require.js"></script>
<script src="js/require-config.js"></script>
<script>
    require(["js/app"]);
</script>

或者您可以在配置中添加顶级deps字段,例如deps: ["js/app"],以避免需要第三个<script>标记。

答案 1 :(得分:-1)

我在ios上使用我的cordova应用程序遇到了同样的问题。动态加载失败并出现相同的错误,但我在浏览器上运行的代码相同。

我的解决方法是首先通过定义&#39; app&#39;应用程序的shim.deps来静态加载模块。在data-main中,因此模块最初通过require加载。随后,当需要模块时它就可用了 - require([&#34; jquery&#34;])就可以了。

但绝对想找到问题的根源,但现在我可以继续了。