【问题标题】:dojo.xd.js not recognizing dojox.data.CsvStoredojo.xd.js 无法识别 dojox.data.CsvStore
【发布时间】:2009-05-29 06:05:48
【问题描述】:

当我使用诸如

之类的导入时
<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 之间是否存在已知问题?

提前致谢,

动漫

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

P.P.S 完整的“工作代码”如下。用 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>

【问题讨论】:

    标签: javascript cdn dojo


    【解决方案1】:

    对您的更新做出反应:

    我强烈认为您应该尝试使用dojo.addOnLoad()。您的&lt;head&gt; 的最后两个&lt;script&gt; 部分一起将变为:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您是否在dojo.addOnLoad() 中运行该代码?如:

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

      另外,您使用的是 FireFox 3 吗?如果是这样,请尝试将您的&lt;script&gt;&lt;/script&gt; 块放在&lt;body&gt; 部分的最后,就在关闭&lt;/body&gt; 标记之前。 (我知道这不是标准做法,但它与 Firefox 的 bug 444322 有关,应该在 3.0.6 版本中修复。)

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

      【讨论】:

      • 感谢您的回答。我现在已经在问题中粘贴了“有效”的完整代码。我没有在 dojo.addOnLoad() 中使用 var stateStore 声明,但它似乎可以正常工作。但是,当我放入 CDN 引用时,它就坏了。
      • 您的问题:您要实例化一个尚未加载的类。当您在本地加载文件时它可以工作,因为它们是在执行您的 javascript 之前加载的。 (当然,在本地加载文件比使用 CDN 更快)。无论如何,使用 dojo.addOnLoad 是唯一的方法与 XD 加载。
      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2013-04-19
        • 2019-01-28
        • 2017-08-10
        • 2019-11-01
        相关资源
        最近更新 更多