dojo.xd.js не распознает dojox.data.CsvStore - PullRequest
3 голосов
/ 25 января 2009

Когда я использую импорт, такой как

<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

P.S. dojo.require("dojox.data.CsvStore"); декларации на месте.

P.P.S Полный «рабочий код» приведен ниже. Замена ссылок 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>

Ответы [ 3 ]

1 голос
/ 25 января 2009

Реакция на ваше обновление:

Я настоятельно думаю, что вы должны попробовать с 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> ... (эта опция также будет работать в других браузерах.)

1 голос
/ 25 января 2009

Вы запускаете этот код внутри 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.

0 голосов
/ 29 мая 2009

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>

Примечание: есть еще один очень похожий случай: Сетка, магазины, XD .

...