QueryReadStore загружает JSON в DataGrid, но JsonRestStore этого не делает (из того же источника)

StackOverflow https://stackoverflow.com/questions/2444801

Вопрос

Я создаю сетку данных Dojo из данных JSON, предоставленных моим интерфейсом REST.DataGrid нормально загружает данные с помощью QueryReadStore, но, похоже, не работает с теми же данными, которые передаются по конвейеру в JsonRestStore.

Я использую следующие библиотеки Dojo с Dojo 1.4.1:

dojo.require("dojox.data.JsonRestStore");
dojo.require("dojox.grid.DataGrid");
dojo.require("dojox.data.QueryReadStore");
dojo.require("dojo.parser");

Я объявляю о своих запасах следующим образом:

var storeJRS = new dojox.data.JsonRestStore({target:"api/collaborations.php/1"});
var storeQRS = new dojox.data.QueryReadStore({url:"api/collaborations.php/1", requestMethod:"get"});

Я создаю свой макет сетки следующим образом:

var gridLayout = [
new dojox.grid.cells.RowIndex({ name: "Row #", width: 5, styles: "text-align: left;" }),
{
name: "Name",
field: "name",
styles: "text-align:right;",
width:20
},
{
name: "Description",
field: "description",
width:30
}
];

Я создаю свою сетку данных следующим образом:
<div dojoType="dojox.grid.DataGrid" jsid="grid2" store="storeQRS" structure="gridLayout" style="height:500px; width:1000px;"></div>

Вышеупомянутое работает, но если я использую QueryReadStore в качестве своего хранилища, сетка создается с заголовками (Name, Description), но она не заполняется никакими строками:
<div dojoType="dojox.grid.DataGrid" jsid="grid3" store="storeQRS" structure="gridLayout" style="height:500px; width:1000px;"></div>

Используя FireBug, я вижу, что QueryReadStore получает мои JSON-данные из моего интерфейса REST.Это выглядит следующим образом:

{"numRows":6,"items":[{"name":"My Super Cool Collab","description":"This is for all the super cool people in the super cool group","id":1},{"name":"My Other Super Cool","description":"This is for all the other super cool people","id":3},{"name":"This is another coll","description":"This is just some other collab","id":4},{"name":"some new collab","description":"this is a new collab","id":5},{"name":"yet another new coll","description":"uh huh","id":6},{"name":"asdf","description":"asdf","id":7}]}

Есть какие-нибудь идеи?Спасибо.

Это было полезно?

Решение

Чтобы использовать JsonRestStore, вашим ответом должны быть только элементы, входящие в приведенный вами образец:

[{"name":"My Super Cool Collab","description":"This is for all the super cool people in the super cool group","id":1},{"name":"My Other Super Cool","description":"This is for all the other super cool people","id":3},{"name":"This is another coll","description":"This is just some other collab","id":4},{"name":"some new collab","description":"this is a new collab","id":5},{"name":"yet another new coll","description":"uh huh","id":6},{"name":"asdf","description":"asdf","id":7}]

Обратите внимание на обозначение массива.

Другие советы

Обработчик службы по умолчанию для JsonRestStore запрашивает диапазон элементов, используя заголовок, и ожидает в ответ массив запрошенных элементов, а не объект.Код для обработки запроса диапазона элементов является:

if(args && (args.start >= 0 || args.count >= 0)){
    request.headers.Range = "items=" + (args.start || '0') + '-' + ((args.count && args.count != Infinity && (args.count + (args.start || 0) - 1)) || '');
}

Если вы хотите, вы можете самостоятельно обработать разбивку на страницы с помощью параметров запроса, предоставив пользовательский GetRequest ИЛИ перезаписав функцию выборки...но принятие объекта вместо массива будет болезненным.Для синтаксического анализа такого объекта потребуется создать подкласс хранилища данных и предоставить пользовательскую функцию _processResults:

dojo.declare("dojox.data.CustomStore", dojox.data.JsonRestStore, {
    _processResults: function(results, deferred){
        var items = SOME_MAPPING_FUNCTION_HERE(results);
        var count = COUNT_RESULTS_HERE;
        return {totalCount:deferred.fullLength || (deferred.request.count == count ? (deferred.request.start || 0) + count * 2 : count), items: items};
    }
}

Это обрабатывает только синтаксический анализ ответа...Я не уверен, что можно так легко изменить размещенный контент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top