2013-04-02 2 views
1

Я пишу JSP, который отображает список клубов в сетке. Сетка показывает название клуба вместе с его широтой, долготой, веб-сайтом и описанием.Объявление переменных в DOJO

Фактические данные для отображения хранятся в переменной (dojo.data.ItemFileWriteStore), называемой clubStore.

При загрузке страницы выполняется вызов сервлета для извлечения данных. Затем функция обработки удаляет все элементы, хранящиеся в хранилище, и добавляет новые элементы, возвращаемые сервлетом.

Код JSP, как показано ниже:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Clubs</title> 
    <style type="text/css"> 
     @import "./dojoroot/dojo/resources/dojo.css"; 
     @import "./dojoroot/dijit/themes/tundra/tundra.css"; 
     @import "./dojoroot/dojox/grid/resources/Grid.css"; 
     @import "./dojoroot/dojox/grid/resources/nihiloGrid.css"; 
    </style> 
    <script type="text/javascript" src="dojoroot/dojo/dojo.js" 
      djConfig="parseOnLoad: true, isDebug: false"> 
    </script> 
    <script language="JavaScript" type="text/javascript"> 
     dojo.require("dojo.parser"); 
     dojo.require("dojo.data.ItemFileWriteStore"); 
     var clubData={ 
      items:[{name:'No Clubs', lat:'---', lon:'---', webSite:'---', description:'---'}] 
     }; 
     var layoutClub=[{field:"name", name:"Name", width:10}, 
         {field:"lat", name:"Lat", width:5}, 
         {field:"lon", name:"Long", width:5}, 
         {field:"webSite", name:"Web Site", width:10}, 
         {field:"description", name:"Description", width:'auto'}]; 
     var clubStore=new dojo.data.ItemFileWriteStore(data:clubData}); 
    </script> 
    <link rel="stylesheet" href="dojoroot/dijit/themes/claro/claro.css" /> 
    <link rel="stylesheet" href="dojoroot/dojox/widget/Dialog/Dialog.css" /> 
</head> 
<body class="tundra"> 
    <%@include file="header.jsp"%> 
    <div id="clubGrid" 
     style="width: 800px;" 
     autoHeight="true" 
     data-dojo-type="dojox/grid/DataGrid" 
     data-dojo-props="store:clubStore, 
         structure:layoutClub, 
         query:{}, 
         queryOptions:{'deep':true}, 
         rowsPerPage:40"> 
    </div> 
    <br> 
    <script> 
     var urlString="http://localhost:8080/BasicWeb/ClubsServlet"; 
     dojo.xhrGet({ 
      url: urlString, 
      handleAs: "text", 
      load: function(data) { 
       // remove items... 
       var allData=clubStore._arrayOfAllItems; 
       for (i=0; i<allData.length; i++) { 
        if (allData[i]!=null) { 
         clubStore.deleteItem(allData[i]); 
        } 
       }    
       var jsonClubArray=JSON.parse(data); 
       for (var i=0; i<jsonClubArray.clubs.length; i++) { 
        var club=jsonClubArray.clubs[i]; 
        var newClub={name: club.clubname, lat:club.lat, lon:club.lon, webSite: club.website, description: club.description}; 
        clubStore.newItem(newClub); 
       } 
       clubStore.save();     
      } 
     }); 
    </script> 
</body> 
</html> 

Сценарий, чтобы обработать ответ сервлета иногда не потому, что clubStore не определено (отладки с помощью Firebug). Это похоже на ложную ошибку, поскольку иногда все работает отлично.

Любая помощь в понимании того, как определить переменную clubStore, будет оценена по достоинству.

Спасибо.

James.

+0

Во-первых, я бы рекомендовал вам не смешивать JSP и JS. Вы можете создать отдельный JS-файл и включить его так же, как и с dojo.js. – Jess

+0

Не могли бы вы прояснить часть «иногда не получается»? какой-либо конкретный браузер? Кроме того, на какой строке происходит сбой?(Я предполагаю, что «var allData = clubStore._arrayOfAllItems;», но просто хотел быть уверенным). Наконец, можете ли вы подтвердить, что «clubStore» определен, если вы разрешаете всем скриптам (и ошибкам) ​​заканчивать и проверять консоль? –

+0

«Иногда не получается» часть была (другой) ошибкой с моей стороны. В более ранней версии кода я скопировал пример из Интернета, где переменная store была объявлена ​​в объекте DOM. Это вызвало ложную ошибку, поскольку сценарий работал до того, как объект DOM завершил загрузку (т. Е. Проблема, предложенная Джессемом ниже). Когда я переместил объявление в скрипт, я ввел синтаксическую ошибку, но предположил, что ошибка все еще была ложной - это было не так. Все исправлено. Спасибо за вашу помощь. – user1936427

ответ

1

Я думаю, что может случиться, что сценарий тела иногда работает перед сценарием головы, поэтому это своего рода состояние гонки. Вы можете попробовать обернуть свой сценарий тела в dojo.ready. (Я предполагаю, что из вашего кода, который вы используете додзё 1.6 или более ранней версии, так как вы не используете стиль AMD загрузчика.)

dojo.ready(function(){ 
    // Put your xhr request code here. 
}); 

Вы также можете попробовать тестирование с Firebug точкой останова в сценарии головы и тела. Посмотрите, иногда ли работает голова.

+1

Спасибо - это «учебный проект» для меня, поскольку я программист на C++ по профессии и совершенно новый для javascript. Понимание того, как структурировать эти проекты, очень полезно. Благодарю. – user1936427

+1

Просто отправил ответ на мой вопрос ниже - проблема была синтаксической ошибкой. Еще раз спасибо. – user1936427

+0

@ пользователь1936427 OK прохладный. FYI вы можете использовать http://www.jslint.com для обнаружения проблем. См. Также эту ссылку SO для способов улучшения форматирования с помощью инструментов: http://stackoverflow.com/questions/7564139/any-tool-to-automatic-fix-simple-jslint-issues – Jess

0

Вы можете попробовать переключить порядок ваши заявления требуют, так как это:

dojo.require("dojo.data.ItemFileWriteStore"); 
    dojo.require("dojo.parser"); 

Если это не удается, вы можете установить parseOnLoad ложь, а затем вызвать dojo.parser.parse() после вашей магазин был экземпляр так:

(если вы используете додзё 1.6 или более ранней версии на основе кода)

dojo.addOnLoad(function() { 
    dojo.parser.parse(); 
}); 
0

Поместите свой clubStore в глобальном пространстве ... дзю улица удалить УАК ключевое слово перед ним ...

+0

Удаление 'var' не рекомендуется в соответствии с к этому сообщению: http://stackoverflow.com/questions/2291252/javascript-global-variables – Jess

1

Таким образом, проблема оказалась ошибка синтаксиса в объявлении - отсутствует «{» в строке

var clubStore=new dojo.data.ItemFileWriteStore(data:clubData}); 

паразитных аспект неисправности была красная сельдь - ранее я объявлял переменную как часть объекта DOM и вызывал ложную ошибку. Поэтому я испортил мое регрессионное тестирование, а также представил синтаксическую ошибку!

Спасибо.

James.

Смежные вопросы