我是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的任何替代建议都会非常有用!
答案 0 :(得分:1)
只需更改依赖项的顺序:
define(['_', 'Backbone', 'ready!'], function(_, Backbone) { /*...*/});
因为您在ready!
变量中有_
个插件,在_.js
变量中有Backbone
。
编辑:您可以将其嵌套:
define(["_", "require"], function(_, require) {
require(["Backbone"], function(Backbone) {
// your code here
})
})
此外,如果下划线或Backbone不是AMD模块,则本地函数变量将覆盖它们。