2009-01-25 71 views
3

当我使用导入如dojo.xd.js不承认dojox.data.CsvStore

<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之间是否存在已知问题?

由于提前,

的Animesh

附: dojo.require("dojox.data.CsvStore");声明已到位。

P.P.S完整的“工作代码”如下。将CSS和JS引用替换为来自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> 

回答

1

反应到您的更新:

我强烈地认为你应该尝试dojo.addOnLoad()。总之,你<head>的最后两个<script>部分将变成:

<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()进来的地方,让你保证在执行作为参数addOnLoad()传递的抽象函数之前加载了其余的javascript。

因为这是一个时间问题,您自己的原始代码有时可能会起作用,或许不是其他问题:它取决于下载速度以及您的浏览器将各个javascript位组合在一起的顺序。这就是为什么使用dojo的远程库偶尔会使用dojo库的本地副本的不同结果。这就是说,如果您使用的是Firefox 3(早于3.0.6),请记住我对已知错误的看法。在这种情况下,你可能需要立即把那<script>块收盘</body>标记之前......(这种选择会在其他浏览器正常工作。)

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的bug 444322有关,这应该在3.0.6版本中修复。)

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

+0

感谢您的回答。我已经粘贴了现在问题中“有用”的完整代码。我没有在dojo.addOnLoad()中使用var stateStore声明,但它似乎工作正常。但是,当我放入CDN参考文件时,它就会中断。 – Animesh 2009-01-25 10:58:26

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