Сетка dgrid ondemand не заполняется хранилищем памяти

Я пытаюсь заполнить свою сетку dgrid onDemand Grid хранилищем памяти, но сетка не заполняется данными. Я делаю вызов xhr.get и убедился, что данные возвращаются. Вот что у меня есть:

 ......     
 var grid;

 function TicketUnMarkedSet(GridData) {//this function is called back after xhr.get and the parameter GridData is populated
          var gridStore = new Memory({ data: GridData });//this store seems to be ok
          grid = new OnDemandGrid({
              showHeader: true,
              store:gridStore
          }, "gridDiv");
          grid.startup(); 
          grid.refresh();
      }

<div style="position: absolute; left: 0px; bottom: 0px; z-index: 999;">
          <div id="tpStationData" data-dojo-type="dijit/TitlePane" data-dojo-props="title:'Open Tickets', closable:false,  open:false">
              <div id="gridTabDiv" data-dojo-type="dijit/layout/ContentPane" style="width: 100%;
                  height: 100%; overflow: auto;" title="Data">
                  <div id="gridDiv">
                  </div>
              </div>
          </div>
      </div>

Любая идея, почему эта сетка будет пустой? Спасибо


person pvitt    schedule 07.07.2014    source источник
comment
Я добавил столбцы в сетку, как показано ниже — столбцы отображаются, но данные — нет. Когда я отлаживаю, я могу посмотреть на сетку и увидеть, что у нее есть хранилище данных. 'code' function TicketUnMarkedSet (GridData) { var gridStore = new Memory ({ data: GridData }); grid = new OnDemandGrid({ showHeader: true, store: gridStore, columns: { ID: ID, Ticket: Ticket, Street: Address, DateRcvd: DateRcvd } ..... 'code'   -  person pvitt    schedule 07.07.2014
comment
Проверьте свои данные json в GridData. Это может быть синтаксическая ошибка. Добавьте в пост, если можно.   -  person GoinOff    schedule 08.07.2014
comment
Я проверил JSON на JSONLint — образец {"TicketUnMarkedGetResult":[{"Company":"E W HARMON","DateRcvd":"\/Date(1387311540000-0800)\/","DaysToWork":-202,"ID":9972,"OldTicket":"A30140156","Priority":"NORM","Street":" EL PRADO RD","Ticket":"A30730511","Type":"UPDT","WorkDate":"\/Date(1387311540000-0800)\/","ptCenterX":-13099875.6316766,"ptCenterY":4024215.96028757}]}   -  person pvitt    schedule 08.07.2014


Ответы (3)


Проверьте объект памяти gridStore, чтобы увидеть, существуют ли действительные данные:

http://dojotoolkit.org/reference-guide/1.10/dojo/store/Memory.html

Я думаю, вам следует добавить строчные буквы «id: 1» к вашим данным JSON и увеличить это значение на 1 для каждой записи.

require(["dojo/store/Memory"], function(Memory){
    var someData = [
        {id:1, name:"One"},
        {id:2, name:"Two"}
    ];
    store = new Memory({data: someData});

    store.get(1) -> Returns the object with an id of 1

    store.query({name:"One"}) // Returns query results from the array that match the given query

    store.query(function(object){
        return object.id > 1;
    }) // Pass a function to do more complex querying

    store.query({name:"One"}, {sort: [{attribute: "id"}]}) // Returns query results and sort by id

    store.put({id:3, name:"Three"}); // store the object with the given identity

    store.remove(3); // delete the object
});

Сделайте ввод данных JSON в GridData похожим на someData в приведенном выше примере.

Возможно изменить:

var gridStore = new Memory({ data: GridData });

to

var gridStore = new Memory({ data: GridData.TicketUnMarkedGetResult });

Затем добавьте хранилище данных (ObjectStore):

dataStore = new ObjectStore({ objectStore: gridStore });

добавьте хранилище данных в свою сетку:

grid = new DataGrid({
        store: dataStore,

Надеюсь, это поможет вам. Я нашел эту информацию на демонстрационной странице для сеток данных:

В этом примере с этой страницы: http://dojotoolkit.org/documentation/tutorials/1.8/datagrid/

Демонстрация сетки додзё:

http://dojotoolkit.org/documentation/tutorials/1.8/datagrid/demo/datagrid.php

Данные JSON для сетки:

http://dojotoolkit.org/documentation/tutorials/1.8/datagrid/demo/hof-batting.json

Код для этой демонстрации:

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Demo: dojox/grid/DataGrid</title>
        <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.8.5/dijit/themes/claro/claro.css" media="screen">
            <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.8.5/dojo/resources/dojo.css" />
    <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.8.5/dojox/grid/resources/claroGrid.css" />
    <link rel="stylesheet" href="style.css" media="screen">
    <link rel="stylesheet" href="../../../resources/style/demo.css" media="screen">
</head>
<body class="claro">
    <h1>Demo: dojox/grid/DataGrid</h1>

    <br/>
    <div id="grid"></div>

    <!-- load dojo and provide config via data attribute -->
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.8.5/dojo/dojo.js"></script>
    <script>
        var grid, store, dataStore;
        require([
            "dojox/grid/DataGrid",
            "dojo/store/Memory",
            "dojo/data/ObjectStore",
            "dojo/request",
            "dojo/domReady!"
        ], function(DataGrid, Memory, ObjectStore, request){
            request.get("all-batting.json", {
                handleAs: "json"
            }).then(function(data){
                store = new Memory({ data: data.items });
                dataStore = new ObjectStore({ objectStore: store });

                grid = new DataGrid({
                    store: dataStore,
                    query: { id: "*" },
                    structure: [
                        {
                            noscroll: true,
                            defaultCell: { width: "84px" },
                            cells: [
                                { name: "First Name", field: "first" },
                                { name: "Last Name", field: "last" }
                            ]
                        },{
                            defaultCell: { width: "60px" },
                            cells: [
                                [
                                    { name: "Bats", field: "bats", width: "70px", rowSpan: 2 },
                                    { name: "Throws", field: "throws", width: "70px", rowSpan: 2 },
                                    { name: "G", field: "totalG" },
                                    { name: "AB", field: "totalAB" },
                                    { name: "R", field: "totalR" },
                                    { name: "RBI", field: "totalRBI" },
                                    { name: "BB", field: "totalBB" },
                                    { name: "K", field: "totalK" }
                                ],[
                                    { name: "Games as Batter", field: "totalGAB", colSpan: 2 },
                                    { name: "H", field: "totalH" },
                                    { name: "2B", field: "total2B" },
                                    { name: "3B", field: "total3B" },
                                    { name: "HR", field: "totalHR" }
                                ]
                            ]
                        }
                    ]
                }, "grid");

                // since we created this grid programmatically, call startup to render it
                grid.startup();
            });
        });
    </script>
</body>

person GoinOff    schedule 08.07.2014
comment
Спасибо, я пробовал этот подход, но все еще не работал. В одном из руководств была grid.on(dgrid-error), которую я использовал, но сетка, похоже, не выдает ошибку. я действительно в тупике - person pvitt; 08.07.2014
comment
Это настоящий удар в темноте... Но как насчет изменения элемента данных json с «TicketUnMarkedGetResult» на «items»?? - person GoinOff; 08.07.2014
comment
Отредактировал мой пост выше, чтобы проверить объект памяти. Посмотрите вверху моего поста. - person GoinOff; 08.07.2014
comment
Я попытался запросить магазин, и ничего не было возвращено. Похоже, что-то не так с магазином. JSON действителен, но по прошлому опыту я знаю, что додзё не нравится формат даты, возвращаемый SQL Server DateRcvd:\/Date(1387311540000-0800)\/. Может быть, это проблема - - person pvitt; 08.07.2014
comment
Я бы удалил {TicketUnMarkedGetResult: из вашего JSON и добавил 'id:‹rec #› к каждой записи. Возможно, определите все поля даты как строки, пока вы не получите данные для правильного отображения. Возможно переименовать поле ID в REC_ID?? - person GoinOff; 08.07.2014

Согласно руководству (подробности см. по ссылке здесь), в нем есть столбцы для сетки данных, которая была исключена в вашем коде.
Может быть, дело в этом.

    // Create an instance of OnDemandGrid referencing the store
    var grid = new OnDemandGrid({
        store: store,
        columns: {
            first: "First Name",
            last: "Last Name",
            totalG: "Games Played"
        }
    }, "grid");

    grid.startup();

Также, если вышеуказанные изменения не работают, вы можете создать локальное хранилище данных (только для целей тестирования), как показано ниже. Это поможет вам сузить проблему.

function TicketUnMarkedSet(GridData) {//this function is called back after xhr.get and the parameter GridData is populated

    var testdata = [
                     { id:1, first: "Bob", last: "Barker", age: 89 },
                     { id:2, first: "Vanna", last: "White", age: 55 },
                     { id:3, first: "Pat", last: "Sajak", age: 65 }
    ];

    var gridStore = new Memory({ data: testdata });

    // Create an instance of OnDemandGrid referencing the store
    var grid = new OnDemandGrid({
        store: gridStore ,
        columns: {
            first: "First Name",
            last: "Last Name",
            age: "Age"
        }
    }, "gridDiv");
    grid.startup();
}
person frank    schedule 08.07.2014

Проблема, похоже, в формате моего json. Когда я получаю его обратно из моего сервиса, это выглядит так:

 [{"Company":"E W HARMON","DateRcvd":"\/Date(1387311540000-0800)\/","DaysToWork":-203,"ID":9972,"OldTicket":"A30140156","Priority":"NORM","Street":" EL PRADO RD","Ticket":"A30730511","Type":"UPDT","WorkDate":"\/Date(1387311540000-0800)\/","ptCenterX":-13099875.6316766,"ptCenterY":4024215.96028757},{"Company":"E W HARMON","DateRcvd":"\/Date(1389731340000-0800)\/","DaysToWork":-175,"ID":10263,"OldTicket":"A30140156","Priority":"NORM","Street":" EL PRADO RD","Ticket":"A30730511","Type":"UPDT","WorkDate":"\/Date(1389731340000-0800)\/","ptCenterX":-13099875.6316766,"ptCenterY":4024215.96028757}]

и это не работает с моим dgrid. Если я запускаю его через валидатор по адресу http://jsonlint.com/, он говорит, что данные действительны json, но изменяется это:

[
{
    "Company": "E W HARMON",
    "DateRcvd": "/Date(1387311540000-0800)/",
    "DaysToWork": -203,
    "ID": 9972,
    "OldTicket": "A30140156",
    "Priority": "NORM",
    "Street": " EL PRADO RD",
    "Ticket": "A30730511",
    "Type": "UPDT",
    "WorkDate": "/Date(1387311540000-0800)/",
    "ptCenterX": -13099875.6316766,
    "ptCenterY": 4024215.96028757
},
{
    "Company": "E W HARMON",
    "DateRcvd": "/Date(1389731340000-0800)/",
    "DaysToWork": -175,
    "ID": 10263,
    "OldTicket": "A30140156",
    "Priority": "NORM",
    "Street": " EL PRADO RD",
    "Ticket": "A30730511",
    "Type": "UPDT",
    "WorkDate": "/Date(1389731340000-0800)/",
    "ptCenterX": -13099875.6316766,
    "ptCenterY": 4024215.96028757
}]

который работает с сеткой - мне просто нужно найти способ сделать это преобразование

person pvitt    schedule 08.07.2014
comment
Похоже, вы почти у цели..w3schools.com/json/json_eval.asp Возможно, попробуйте var gridObj = JSON.parse(gridData); затем подключите gridObj к вашему хранилищу данных?? - person GoinOff; 09.07.2014
comment
JSON.parse() не работает, я думаю, потому что это уже массив объектов. Я пытаюсь преобразовать в строку, добавить возврат каретки после каждого объекта, а затем выполнить повторный анализ. var STicketData = JSON.stringify(результат, ноль, \r); var OTicketData = JSON.parse(STicketData). Но с этим не повезло - person pvitt; 09.07.2014