Javascript 尝试使用Dijit但未定义get:Dojo

Javascript 尝试使用Dijit但未定义get:Dojo,javascript,dojo,Javascript,Dojo,我试图在我的模板中包含一个演示dijit小部件。然而,我不断得到:“Dojo没有定义”。我试图找到答案,但我找不到。这个错误很奇怪,因为浏览器确实加载了所需的dojo.js 不起作用的是: dojo.require("dijit.form.MultiSelect"); 但是,如果我使用其他dojo模块执行以下操作: require(["dojo/store/JsonRest" ... 它起作用了 我在这里创建了我的模板的粘贴库:这是Dojo 1.7吗 对于该版本,我认为Dojo希望在全局命名

我试图在我的模板中包含一个演示dijit小部件。然而,我不断得到:“Dojo没有定义”。我试图找到答案,但我找不到。这个错误很奇怪,因为浏览器确实加载了所需的dojo.js

不起作用的是:

dojo.require("dijit.form.MultiSelect");
但是,如果我使用其他dojo模块执行以下操作:

require(["dojo/store/JsonRest" ...
它起作用了

我在这里创建了我的模板的粘贴库:

这是Dojo 1.7吗

对于该版本,我认为Dojo希望在全局命名空间中定义函数
define()
require()

然后使用这些函数来要求dojo本身。您的dojo.js中可能包含所有库,但在您明确地
需要它们之前,它们可能无法使用

这对我很有用(使用Dojo 1.7.2):


//Dojo 1.7(AMD)
require([“dojo”],function(dojo){
require(“dijit.form.MultiSelect”);
ready(function()){
var sel=dojo.byId('dynamic');
var n=0;
for(dijit中的变量i){
var c=dojo.doc.createElement('option');
c、 innerHTML=i;
c、 值=n++;
所选儿童(c);
}
新的dijit.form.MultiSelect({name:'dynamic'},sel);
});
});

正如Paul Grime所指出的,如果将Dojo 1.7与async:true标志集一起包含(正如您所做的那样),那么它将只向全局命名空间公开
require
define
函数。这是向最近推出的新型AMD模块过渡的一部分

您现在可以选择其中之一

  • 在代码周围添加一个小小的“requiredojo”包装器

  • 删除“async:true”标志并依赖于1.6的后端兼容性

  • 将代码转换为使用新的1.7AMD异步模块,而不是使用“dojo.require”的旧同步样式

  • <script>
    // Dojo 1.7 (AMD)
    require(["dojo"], function(dojo){
    
    dojo.require("dijit.form.MultiSelect");
    dojo.ready(function(){
            var sel = dojo.byId('dynamic');
            var n = 0;
            for(var i in dijit){
                    var c = dojo.doc.createElement('option');
                    c.innerHTML = i;
                    c.value = n++;
                    sel.appendChild(c);
            }
            new dijit.form.MultiSelect({ name: 'dynamic' }, sel);
    });
    
    });
    </script>