0

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

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

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

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

具体的东西...

索引.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>

应用程序.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 之前加载下划线的任何替代建议都会非常有帮助!

4

1 回答 1

1

只需更改依赖项的顺序:

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

因为您在变量和变量中都有ready!插件。__.jsBackbone

编辑:您可以嵌套它:

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

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

})

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

于 2012-09-05T18:15:48.873 回答