尝试使用Dijit但得到:Dojo未定义

时间:2012-03-04 17:00:26

标签: javascript dojo

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

什么是无效的:

dojo.require("dijit.form.MultiSelect");

但是,如果我使用其他dojo模块:

require(["dojo/store/JsonRest" ...

有效。

我在这里制作了模板的pastebin:http://pastebin.com/9fm13pSP

2 个答案:

答案 0 :(得分:4)

这是Dojo 1.7吗?

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

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

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

<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>

答案 1 :(得分:3)

正如Paul Grime指出的那样,如果你将 async:true 标志设置为Dojo 1.7(就像你所做的那样)它只会公开requiredefine函数到全局命名空间。这是最近推出的新型AMD模块过渡的一部分。

您现在可以选择

  1. 在代码

  2. 周围添加一点“require dojo”包装器
  3. 删除“async:true”标志并依赖与1.6的反向兼容性

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