Сортировка данных на странице.

У меня много страниц в datatable(“total_count”=> 100000), при сортировки выдает ошибку Cannot read property ‘id’ of undefined. ошибка пропадает если я datafetch также ставлю 100000. Как можно избежать этой ошибку?

While Webix is developed in Belarus, its community is international. Let’s try to post in English, even if it comes from Google Translate:

I have a lot of pages in the datatable (“total_count” >= 100000), and sorting generates an error “Can not read property ‘id’ of undefined.” The error disappears if I set datafetch to 100000 as well. How can I avoid this error?

When you are using dynamical data loading datatable will not be able to sort data on client side ( as not all data is loaded ), in such case you need to use server side sorting.

In case of server side sorting, datatable will reload data from a server side. Url will contain information about requested sorting mode.


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

При серверной сортировке клиент перегрузит данные с сервера, передав желаемые параметры сортировки в урле запроса.

view:"datatable",
columns:[
    { id:"package", header:"Name", sort:"server"},
    {..}
],

Немного расширю вопрос.

  1. Каким образом программно передать собственные параметры на сервер при динамической загрузке. Допустим у меня есть фильтры, от комбинации которых меняются данные выдаваемые сервером. Как я понял ваша компонента передает запрос на сервер следующего вида: “data/data_dyn.php?continue=true&count=100&start=130”, где “data/data_dyn.php” прописано в url. Как выход, я вижу добавить к этому url дополнительные параметры фильтрации. Правильный подход я хочу использовать в этом случае?

  2. Каким образом при смене моего фильтра, заставить ваш компонент обновить данные, т.е. загружать их уже с другими настройками? Как выход я вижу предполагаю использовать api вызов loadNext. Но в таком случае запрос с сервера происходит единожды, и при скроллинге уже не вызывается автоматически вновь.

(1) можно использовать onDataRequest событие, в котором определить свой вызов серверного скрипта, включив в вызов и свои параметры.

dtable.attachEvent("onDataRequest", function(start, count){
     var data = webix.ajax("some.php", { start:start, count:count, myfilter: value})
     dtable.parse(data);
     return false;
})

(2) Если используется исключительно ваши фильтры, без serverFilter|serverSelectFilter то можно сделать просто clearAll + load новых данных. Если в ответе будет правильный total_count - при последующем скроллинге браузер будет выполнять автоматические запросы на тот же урл что использовался в load комманде

Благодарю. Обе подсказки оказали неоценимую помощь.

Возникла похожая ситуация. Я вывожу через DataTable большой объём данных, в районе 100 000 строк, возможно будет и больше.

В качестве основы взял готовый пример http://docs.webix.com/samples/15_datatable/16_dyn_loading/04_db_dyn_loadahead.html единственное что заменил в нём SQLite на MySQL. Всё прекрасно выводится. Но вот фильтрация не работает совсем.

{ id:“package”, header:“Name”, sort:“server”}

Добавление параметра sort вызвало только появление стрелочки при клике по заголовку, при этом кроме смены направления стрелочки больше ничего не происходит.

Но вот фильтрация не работает совсем.

В режиме динамической загрузки клиентская фильтрация и сортировка не будут работать, так как для их работы нужны все данные а в случае динамической загрузки на клиенте присутстсвует только часть данных

Надо использовать серверную фильтрацию и серверную сортировку

Так а чем тогда sort:“server” отличается от sort:“text” ?

эмм, если вы используете sort:“server” для столбца, то при попытке сортировки, компонента сделает запрос к серверу ( тот же урл что использовался для первоначальной загрузки с добавлением параметра sort ) и будет ожидать от сервера отсортированных данных