RequireJS加载脚本文件但传递的引用未定义

时间:2012-10-12 10:20:44

标签: requirejs amd

我有以下requireJS配置。当试图引用包/ ImagingX模块时,我总是得到未定义,即使我可以看到脚本已经加载到firebug中。如果我将有问题的js文件移动到baseUrl目录中并删除package /它按预期工作。

我做错了什么?

window.requirejs.config(
        {
            baseUrl: '/Scripts',
            paths: {
                "jquery": "./jquery-1.7.1.min",
                "jqx": "/Content/Plugins/jqWidgets",
                "package" : "/Scripts/packages"
            },
            urlArgs: "bust=" + (new Date()).getTime(),
            shim : {
                'jqx/jqxcore': ['jquery'],
                'jqx/jqxsplitter': ['jquery','jqx/jqxcore']
            }
        }
    );

    window.require(['jquery', 'layoutManager', 'container', 'package/ImagingX'],
        function ($,lm,container,px) {

            px.Focus();

            $(document).ready(function () {
                lm.Init(); // Sets up panes
                container.Init(); //Set up the containers
            });
    });

更新15/10/2012

我现在急需解决这个问题,我已经把所有内容都删回了基础,所以这里是新的主文件:

(function () {

    requirejs.config({
        paths: {
            "packages": "packages"
        }
    });

    require([
            'packages/testmodule'
        ],
        function (tm) {
                alert(tm);
    });

})();

位于子文件夹中的模块名为packages。

define('testmodule',
function () {

    alert("called");

    return {
        set : 'rar  '    
    };

});

我可以看到脚本已加载但它永远不会被执行,因此我从来没有得到它的参考。

enter image description here

2 个答案:

答案 0 :(得分:3)

 requirejs.config({
        paths: {
            //"jquery": "./jquery-1.8.2.min",
            //"jqx": "/Content/Plugins/jqWidgets",
            "templates": 'templates',
            "text": "commonRequireJsModules/text",
            "domReady": "commonRequireJsModules/domReady",
            "packages" : 'packages/'
            //'signalR': './jquery.signalR-0.5.3.min',
            //'knockout': './knockout-2.1.0',
            //'pubsub' : './pubsub'
        }
        //,urlArgs: "bust=" + (new Date()).getTime()
        //,
        //shim : {
        //    'jqx/jqxcore': ['jquery'],
        //    'jqx/jqxsplitter': ['jquery', 'jqx/jqxcore'],
        //    'signalR': ['jquery'],
        //    'pubsub' : ['jquery']
        //}
    });

包路径上的尾部斜杠似乎解决了这个问题,部分原因是还删除了模块的define部分中的名称。所以它现在看起来像

define(['deps'],function(deps){
});

而不是

define('myMod',['deps'],function(deps){
});

答案 1 :(得分:1)

一些事情:

  • 使用window.require而不是只需要
  • 似乎很奇怪
  • 'shim'中的名称必须与'paths'中的名称匹配,但情况并非如此,
  • document.ready由require完成,无需再次执行

那么:你的JS控制台中是否有任何加载错误?它是否说缺少脚本?

这是一个工作需求配置,路由器位于此代码的同一文件夹中:

require.config({
    paths:{
        'jquery':'lib/jquery.min',
        'backbone':'lib/backbone.min',
        'underscore':'lib/underscore.min',
        'router':'Router'
    },
    shim:{
        'backbone':{ deps:['jquery', 'underscore'] },
        'router':{ deps:['backbone'] }
    }
});

require(['router', 'jquery', 'underscore', 'backbone'],
    function (Router) {
        var router = new Router();
        $('img').hide();
    });
});

还有index.html:

<html>
<head>
    <script data-main="assets/js/App.js" src="assets/js/lib/require.min.js"></script>
</head>
<body>...</body>
</html>