3

当我使用诸如

<script type="text/javascript" src="http://o.aolcdn.com/dojo/1.2.3/dojo/dojo.xd.js"
      djConfig="parseOnLoad:true, isDebug: true"></script>

我得到错误

dojox.data.CsvStore is not a constructor 

对于诸如

var stateStore = new dojox.data.CsvStore({url: "dojo-passcsv.php", label: "name"});

但是如果我使用从本地安装的 dojo 导入,错误就会消失,例如

<script type="text/javascript" src="dojo-release-1.2.3/dojo/dojo.js"
     djConfig="parseOnLoad:true, isDebug: true"></script>

我真的希望能够使用 CDN 托管的 dojo 安装。DojoX 库和 dojo.xd.js 之间是否存在已知问题?

提前致谢,

动漫

PSdojo.require("dojox.data.CsvStore");声明已经到位。

PPS 完整的“工作代码”如下。用 CDN 中的引用替换 CSS 和 JS 引用会破坏它。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style type="text/css">
        @import "dojo-release-1.2.3/dijit/themes/tundra/tundra.css";
        @import "dojo-release-1.2.3/dojo/resources/dojo.css"
    </style>
    <script type="text/javascript" src="dojo-release-1.2.3/dojo/dojo.js"
         djConfig="parseOnLoad:true, isDebug: true"></script>
    <script>
        dojo.require("dojox.data.CsvStore");
        dojo.require("dijit.Tree");
        dojo.require("dojo.parser");
    </script>
    <script type="text/javascript">
        var stateStore = new dojox.data.CsvStore({url: "states.csv", label: "name"});
    </script>


</head>
<body class="tundra">
    <div dojoType="dijit.Tree" store="stateStore" labelAttr="name" label="States">
    </div>
</body>
</html>
4

3 回答 3

1

你在里面运行那个代码dojo.addOnLoad()吗?如:

dojo.addOnLoad(function(){
   dojo.require("dojox.data.CsvStore");
   var stateStore = new dojox.data.CsvStore({url: "dojo-passcsv.php", label: "name"});
});

另外,您使用的是 FireFox 3 吗?如果是这样,请尝试将您的<script></script>块放在该<body>部分的最后,就在结束</body>标记之前。(我知道这不是标准做法,但它与 Firefox 的错误 444322相关,应该在 3.0.6 版中修复。)

除此之外,您的代码似乎还不错,而这种奇怪的差异通常归结为加载 dojo 模块的时间问题。

于 2009-01-25T05:12:15.103 回答
1

对您的更新做出反应:

我强烈认为你应该尝试使用dojo.addOnLoad(). 一起,您的最后两个<script>部分<head>将变为:

<script>
   dojo.addOnLoad(function(){
      dojo.require("dojox.data.CsvStore");
      dojo.require("dijit.Tree");
      dojo.require("dojo.parser");  /* I don't think you really need this line */
      var stateStore = new dojox.data.CsvStore({url: "states.csv", label: "name"});
   });
</script>

原始代码的问题在于,您无法保证在您即将创建它的实例dojox.data.CsvStore时已经读取了构造函数。stateStore这就是dojo.addOnLoad()进来的地方,让您保证在执行作为参数传递的抽象函数之前加载了其余的 javascript addOnLoad()

因为这是一个时间问题,您自己的原始代码有时可能会起作用,而其他代码可能不起作用:这取决于下载速度以及您的浏览器将各种 javascript 位组合在一起的顺序。这就是为什么使用dojo 的远程库有时可能会与使用您自己的dojo 库的本地副本产生不同的结果。

也就是说,如果您使用的是 Firefox 3(早于 3.0.6),请记住我所说的关于已知错误的内容。在这种情况下,您可能希望将该<script>块紧挨在结束</body>标记之前...(该选项也适用于其他浏览器。)

于 2009-01-25T15:49:11.343 回答
0

Pierdeux认为addOnLoad是关键是正确的,但它应该在 dojo.requires 之后,而不是之前。此外,必须从自动 djConfig.parseOnLoad(它在 addOnLoad 之前触发)切换到手动启动解析器。当您仍然更改该商店 URL 以指向某个合理的位置(在您的网站上)时,这有效:

<script>
   dojo.require("dojox.data.CsvStore");
   dojo.require("dijit.Tree");
   dojo.require("dojo.parser");
   dojo.addOnLoad(function(){
      stateStore = new dojox.data.CsvStore({url: "states.csv", label: "name"});
      dojo.parser.parse();
   });
</script>

注意:还有另一个非常相似的案例:Grid、stores、XD

于 2009-05-28T22:05:48.303 回答