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 完全な「作業コード」は以下のとおりです。CSS および JS 参照を CDN からのものに置き換えると、それが壊れます。

<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>ブロックを配置してみてください。(これは標準的な方法ではありませんが、Firefoxのバグ444322に関連しており、リリース3.0.6で修正されるはずです。)<body></body>

それ以外は、コードは問題ないようです。このような奇妙な不一致は、通常、dojoモジュールのロードのタイミングの問題に帰着します。

于 2009-01-25T05:12:15.103 に答える
1

アップデートへの対応:

で試してみるべきだと強く思いますdojo.addOnLoad()。一緒に、<script>あなたの最後の 2 つのセクションは次のよう<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を作成しようとしている時点でコンストラクター関数が読み取られていることを保証できないことです。stateStoredojo.addOnLoad()パラメータとして渡された抽象関数を実行する前に、JavaScript の残りの部分がロードされていることを保証しますaddOnLoad()

これはタイミングの問題であるため、独自のオリジナル コードが機能する場合もあれば、機能しない場合もあります。ダウンロード速度と、ブラウザーがさまざまな JavaScript ビットを組み合わせる順序によって異なります。そのため、Dojo のリモート ライブラリーを使用すると、Dojo ライブラリーの独自のローカル コピーを使用した場合とは異なる結果になることがあります。

とはいえ、Firefox 3 (3.0.6 より前) を使用している場合は、既知のバグについて私が言ったことを覚えておいてください。その場合、その<script>ブロックを終了タグの直前に置くことをお勧めし</body>ます... (このオプションは他のブラウザでも機能します。)

于 2009-01-25T15:49:11.343 に答える
0

addOnLoadが鍵であるというPierdeuxの指摘は正しかったのですが、それは 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 に答える