Пейджинг не работает, используя JsonRest с EnhancedGrid

Я создаю виджет для IBM BusinessSpace, и у меня возникают трудности с пейджингом. Данные успешно возвращаются из базы данных (с помощью рестлета) и отображаются в сетке. Навигация также отображается под сеткой (следующая страница, предыдущая страница, переход на страницу, количество страниц и т. д.). Если у меня, например, 3 страницы, 5 строк на странице, и я хочу перейти на вторую страницу, когда я нажимаю на страницу номер 2, данные перезагружаются (похоже, снова вызывается рестлет), и первые 5 строк (отображается на первой странице) показаны и на этой. Если я выберу любой другой вариант навигации (следующая страница, ...), произойдет то же самое. В итоге каждый щелчок приводит к появлению первых 5 строк из моей базы данных. Любая подсказка о том, как решить эту проблему?

Вот код по этому поводу:

dojo.require("dojo.data.ObjectStore"); 
dojo.require("dojox.grid.enhanced.plugins.Pagination"); 
dojo.require("dojox.grid.EnhancedGrid"); 
dojo.require("dojo.store.JsonRest"); 


var restStore = new dojo.store.JsonRest({target:"https://localhost:9443/Application/hello"}); 

var dataStore = dojo.data.ObjectStore({objectStore: restStore}); 

dojo.ready(function(){ 

    var grid = new dojox.grid.EnhancedGrid({ 

        store: dataStore, <br>
        structure: [                   
            {name:"Value", field:"value", width: "auto"}, 
            {name:"RequestID", field:"requestId", width: "auto"}, 
            {name:"ID", field:"id", width: "auto"}, 
            {name:"Name", field:"name", width: "auto"} 
        ],         
        columnReordering: true, 
        clientSort: true, 
        rowSelector: '20px', 
        rowsPerPage: 5, 
        autoHeight: true, 
        plugins: {
            pagination: { 
                pageSizes: ["5", "10", "15", "All"], // page length menu options 
                description: true, // display the current position
                sizeSwitch: true, // display the page length menu
                pageStepper: true, // display the page navigation choices 
                gotoButton: true, // go to page button   
                position: "bottom" // position of the pagination bar  
            }
        } 
    }, "gridDiv");
    grid.startup(); 
});

person Snowhite    schedule 23.03.2012    source источник
comment
Пожалуйста, добавьте свою реализацию на стороне сервера здесь   -  person Pete_ch    schedule 03.09.2012


Ответы (1)


При использовании jsonRest в сетке, когда вы прокручиваете записи, которые не отображаются, еще не загружены, в этот момент jsonRest делает запрос на данные, необходимые для отображения, чтобы этот пейджер работал должным образом, в вашей реализации остальных вы должны потреблять заголовок, который создает dojo (диапазон: 0-24), этот отправляется dojo, чтобы вы знали смещение и предел для необходимых данных, для ответа вы должны вернуть заголовок (Content-Range: элементы 0-24/ 66), числа говорят додзё, откуда и куда оно должно показываться и сколько всего записей.

Это пример в php (при условии, что db и response являются реальными объектами):

$range = $request->headers->get('Range');

preg_match_all ('/.*?(\d+).*?(\d+)/is', $range, $matches);

$limit = $matches[2][0];
$offset = $matches[1][0];

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT {$limit} OFFSET {$offset}";
$result = $db->execute($sql);

$sql2 = "SELECT FOUND_ROWS()";
$count = $db->execute($sql2);

$response->setContent($result);
$response->headers->set('Content-Range', "items $offset-$limit/{$count}");

В документации jsonRest есть некоторая информация.

person Jmsegrev    schedule 16.05.2012
comment
Знаете ли вы, есть ли способ для JsonRest реализовать ленивую загрузку? - person WoodenKitty; 30.10.2013