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

时间:2012-09-05 18:11:20

标签: javascript dojo dependencies amd

我是Dojo(1.7)的新手并且完全愿意接受我是一个白痴(我只希望不是)。我更习惯在AMD上使用require.js,但我正在使用第三方(ESRI)映射API来强制Dojo并使用它的AMD,这意味着如果我尝试使用require.js,我会遇到令人讨厌的错误。

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

我知道Backbone依赖于Underscore,到目前为止我还不知道如何确保首先加载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();
        }
    };

});

主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的任何替代建议都会非常有用!

1 个答案:

答案 0 :(得分:1)

只需更改依赖项的顺序:

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

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

编辑:您可以将其嵌套:

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

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

})

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