【问题标题】:Dojo AMD loader executing define callbacks with empty / missing dependenciesDojo AMD 加载程序执行定义具有空/缺少依赖项的回调
【发布时间】:2012-09-05 18:11:19
【问题描述】:

我是 Dojo (1.7) 的新手,完全愿意接受我是个白痴(我只是希望不是)。我更愿意为 AMD 使用 require.js,但我使用的是第 3 方 (ESRI) 映射 API,它强制我使用 Dojo 并使用它的 AMD,这意味着如果我尝试使用 require.js 也会出现严重错误。

我有 defined 一个依赖于 Backbone 和 Underscore 的模块(我最终可能会使用 Dojo 的 MVC,但我不认为这个问题是 Backbone 特有的,所以我想弄清楚它)。奇怪的是,当模块加载时,Dojo 似乎在我的define 中执行回调,此时依赖项(下划线和主干)是空对象{}。由于 Backbone 的 View 属性不存在,我的回调的 return Backbone.View.extend... 中出现错误。

我知道 Backbone 依赖于 Underscore,到目前为止,我不知道如何确保在不使用看起来很老套的 require({async:0},['test1.js','test2.js'... 的情况下首先加载 Underscore。但是,在这种情况下,Underscore 也是一个空对象,所以 define 的回调会在任一依赖加载之前执行???

编辑在此错误发生之前,我在控制台中看到了 Underscore 和 Backbone HTTP 请求以及 200 个响应,因此我假设它们的引用没有问题。

具体的...

index.html:

<script type="text/javascript">

    var dojoConfig = {
        tlmSiblingOfDojo: false,

        packages: [
            {name: 'app', location: '/js'},
            {name: 'lib', location: '/js/lib'}
        ],

        aliases: [
            ['Backbone', 'lib/backbone-0.9.2.min'],
            ['_', 'lib/underscore-1.3.3.min'],
            ['$', 'lib/jquery-1.8.0.min'],

            ['ready', 'dojo/domReady']
        ]
    };

</script>
<script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.1"></script>
<script type="text/javascript">

    require([ 'app/app' ], function(App) {
        App.initialize();
    });

</script>

app.js:

define(['app/views/main-view'], function(MainView) {

    return {
        initialize : function() {
            new MainView();
        }
    };

});

主视图.js:

define(['_', 'Backbone', 'ready!'], function(_, Backbone) {

    // *** ERROR THROWN HERE, Backbone = {}, _ = {} ***
    return Backbone.View.extend({

        el: 'main',

        initialise: function() {

            console.log('main view initialising');

            this.render();
        },

        render: function() {

            console.log('main view rendering');
        }

    });
});

谁能(请)告诉我这里发生了什么?此外,在 Backbone 之前加载下划线的任何替代建议都会非常有帮助!

【问题讨论】:

    标签: javascript dojo dependencies amd


    【解决方案1】:

    只需改变依赖的顺序:

    define(['_', 'Backbone', 'ready!'], function(_, Backbone) { /*...*/});
    

    因为你在_ 变量中有ready! 插件,在Backbone 变量中有_.js

    编辑:你可以嵌套它:

    define(["_", "require"], function(_, require) {
    
        require(["Backbone"], function(Backbone) {
            // your code here
        })
    
    })
    

    另外,如果 underscore 或 Backbone 不是 AMD 模块,本地函数变量将覆盖它们。

    【讨论】:

    • 感谢您的输入,但是嵌套对 Backbone 的调用并不会改变执行回调时下划线仍然是空对象的事实。我敢说即使在这个嵌套的需求中,Backbone 也将仍然是一个空对象。根据我的 dojoConfig 对象,'_' 和 'Backbone' 都作为模块加载,即使不是,它们也肯定是 undefined,而不是 {},如果局部变量覆盖了模块的值
    • 嵌套的 require 方法也不允许我将自己的模块定义为基于 Backbone 的对象,因为我无法直接从定义回调返回视图
    • 我不知道 underscore.js 或 Backbone.js,但如果这些文件未定义为 AMD,即它们以 define([], function(){ /*factory*/ return Backbone; }) 开头,则 AMD 加载程序无法将对象分配给局部变量。
    • 如果您需要将非 AMD JS 封装到 AMD 中,您可以在这里获得一些灵感:jasonwyatt.tumblr.com/post/18015760792/…
    • "嵌套的 require 方法也不允许我定义自己的模块" - 你可以使用 moduleexports: livedocs.dojotoolkit.org/loader/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多