繁体   English   中英

Dojo AMD加载程序执行具有空/缺失依赖项的定义回调

[英]Dojo AMD loader executing define callbacks with empty / missing dependencies

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

我已经define了一个依赖于Backbone和Underscore的da模块(我可能最终会使用Dojo的MVC,但是我认为这个问题不是Backbone特有的,所以我想弄清楚它)。 奇怪的是,加载模块时,Dojo似乎正在我的define内执行回调,并且此时依赖项(Underscore和Backbone)是空对象{} 我的回调函数的return Backbone.View.extend...发生错误,因为Backbone的View属性不存在。

我知道Backbone依赖于Underscore,到目前为止,我还不知道如何确保在不使用看起来像hacky的require({async:0},['test1.js','test2.js'...但是,在这种情况下,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();
        }
    };

});

main-view.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之前加载Underscore的任何其他建议也将非常有用!

只需更改依赖关系的顺序即可:

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

因为你ready! _变量中的插件和Backbone变量中的_.js

编辑:您可以嵌套它:

define(["_", "require"], function(_, require) {

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

})

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM