Dojo AMD加载器执行定义具有空/缺少依赖关系的回调

我是新来的道场(1.7),完全愿意接受我是一个白痴(我只是希望不会)。 我更愿意使用AMD的require.js,但我使用的是第三方(ESRI)映射API,它强制Dojo对我使用AMD,这意味着如果我尝试并使用require.js,则会出现令人讨厌的错误。

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

我知道Backbone依赖于Underscore,到目前为止,我还不知道如何确保Underscore先被加载,而不使用哈希式的require({async:0},['test1.js','test2.js'...然而,在这种情况下下划线也是空的对象,因此该define被加载或者依赖之前执行的回调???

编辑我发现这个错误发生之前,在控制台中看到下划线和骨干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的其他建议会非常有帮助!


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

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

因为你已经ready! 插件在_变量和_.jsBackbone变量。

编辑:你可以嵌套它:

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

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

})

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

链接地址: http://www.djcxy.com/p/92517.html

上一篇: Dojo AMD loader executing define callbacks with empty / missing dependencies

下一篇: RequireJS vs Dojo 1.7 AMD