2013-06-12 2 views
0

Я использую dgrid 0.3.2 вместе с JsonRest для отображения таблиц данных. Недавно я рассматривал обновление до dgrid 0.3.6 или 0.3.7. Вещи работают в основном одинаково, но, похоже, с более новыми версиями dgrid, если пользователь щелкает заголовок столбца для сортировки достаточно быстро, сетка начнет отображать повторяющиеся строки. Я проверил, что ответ JSON и диапазон верны, и это, похоже, не произошло, когда мы использовали dgrid 0.3.2.Дублированные строки при сортировке dgrid 0.3.6

Вот простой тестовый пример, который воспроизводит проблему и имитирует, как мы настраиваем нашу сетку и сохраняем ее. Я делаю что-то неправильно? Если я не завершу JsonRest в кеше, я не получу эту проблему, поэтому я уверен, что проблема есть, но я не уверен в характеристиках производительности, не кэшируя ответ JSON.

<!doctype html> 
<html> 

<head> 
<% 
    String dgridVer = request.getParameter("dgridVer"); 
    if (dgridVer==null) { dgridVer = "0.3.6"; } 
%> 
<script type="text/javascript"> 
    var dojoConfig = { 
     isDebug: true, 
     baseUrl: 'dojo', 
     packages: [ 
      { name: 'dojo',  location: 'dojo' }, 
      { name: 'dijit',  location: 'dijit' }, 
      { name: 'dojox',  location: 'dojox' }, 
      { name: 'dgrid',  location: 'dgrid-<%=dgridVer%>' }, 
      { name: 'put-selector',  location: 'put-selector' }, 
      { name: 'xstyle', location: 'xstyle' }, 
      { name: 'datagrid', location: '../datagrid' } 
     ] 
    }; 
</script> 
<script src="dojo/dojo/dojo.js"></script> 
</head> 

<body> 
Try sorting a column as fast as you can. Look for duplicated rows.<br> 
Using dgrid version: <%=dgridVer %><p> 

<div id='gridDiv'></div> 

<script> 
require(['dgrid/Grid', 'dgrid/extensions/Pagination', 'dojo/store/JsonRest', 
      'dojo/store/Cache', 'dojo/store/Memory', 'dojo/_base/declare', 'dojo/domReady!'], 
    function(Grid, Pagination, JsonRest, 
       Cache, Memory, declare) { 

    var columns = [ 
     { field: "first", label: "First Name" }, 
     { field: "last", label: "Last Name" }, 
     { field: "age", label: "Age" } 
    ]; 

    var store = new JsonRest({ 
     target: 'testData.jsp', 
     sortParam: "sortBy" 
    }); 
    store = Cache(store, Memory()); 

    var grid = new (declare([Grid, Pagination]))({ 
     columns: columns, 
     store: store, 
     loadingMessage: 'Loading...', 
     rowsPerPage: 4, 
     firstLastArrows: true 
    }, 'gridDiv'); 

}); 
</script> 

</body> 

</html> 

ответ

1

Проверка реализации по умолчанию Cache.js, особенно query и queryEngine функции. По умолчанию они всегда попадают в главное хранилище, которое в вашем случае является магазином JsonRest. Только после того, как данные были загружены, хранилище кеширования обновляется (в вашем случае находится магазин Memory).

Теперь, если вы проверяете функцию _setSort в DGrid List.js файл и функцию refresh в DGrid OnDemandList.js вы подоконник увидеть, что по умолчанию DGrid называет query метод текущего store, чтобы получить новый список элементов, отсортированных по-разному. В вашем случае это магазин dojo/store/Cache.

Итак, подводя итог, когда пользователь щелкает столбец сортировки, DGrid запрашивает Cache, который, в свою очередь, запрашивает JsonRest, который в свою очередь запрашивает сервер, который затем возвращает новые данные, которые затем в Cache магазины в Memory магазин.

Фактически вы можете подтвердить это, например, Firebug (расширение Firefox). В моем случае, когда я пытался сортировать, Firebug показывал новый запрос на сервер для получения новых данных.

Это имеет смысл, когда есть много строк, потому что DGrid предназначен для загрузки только первой партии строк, а затем обновления сетки при прокручивании пользователя. Когда сортировка изменяется, первая видимая партия строк может отличаться и может не загружаться, поэтому DGrid должен сначала загрузить их.

Но в моем случае запрос Json возвращал все данные за один запрос. Мне не понравилась реализация по умолчанию и реализовано мое собственное хранилище кеширования, которое не требует поездки на сервер при изменении сортировки. Теперь я не могу поделиться реализацией, но постараюсь сделать, когда у меня есть время, чтобы привести в порядок код.

На данный момент вы не должны замечать никаких проблем с производительностью, если вы переходите на магазин JsonRest (учитывая, что при изменении сортировки в любом случае происходит поездка на сервер).

Я не уверен, что вызывает конкретную проблему дублированных строк, но я помню, что видел это тоже, когда хранилище кэширования не было выполнено должным образом (это было связано с отложенными запросами при загрузке данных. Если я правильно помню). Вы можете попробовать отладить его, добавив (снова с Firebug) точки останова в get и query функции магазина Cache. Моя ставка заключается в том, что DGrid пытается загрузить определенные строки с помощью метода get (который попадает в кеш), а запрос query по-прежнему загружает данные с сервера после того, как пользователь изменил сортировку. Но я могу ошибаться, поэтому сначала попробуйте подтвердить это, если сможете.

+0

Извините, мне потребовалось столько времени, чтобы ответить. Спасибо за ответ, и вы думали, о чем я думал. Я не мог понять, что изменилось в коде dgrid, но изолировало его до 0,3,5, когда это поведение изменилось. Я создал [выпуск 635] (https://github.com/SitePen/dgrid/issues/635) и упомянул обходное решение, которое я придумал, - просто отключив сортировку столбцов, пока сортировка выполняется. –

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