Имя: Пароль:
IT
Веб-мастеринг
NodeJS большие таблицы скроллинг. с динамической подгрузкой данных.
0 mingw
 
13.04.16
15:51
Сабжем никто не занимался случаем?

Как решали?
1 badboychik
 
13.04.16
15:54
грузить асинхронно порциями, какие еще могут быть варианты
2 orefkov
 
13.04.16
15:56
какая связь между NodeJS и скроллингом таблиц?
NodeJS - серверный код.
3 mingw
 
13.04.16
15:58
(1) Варианты в определении нужной порции.
4 mingw
 
13.04.16
15:59
(2) В этом и смысл. БД Постгрес. Через курсоры? А как обновлять. Как синхронить с клиентом?
5 Fragster
 
гуру
13.04.16
16:03
(4) в том то и дело, что (2)
6 mingw
 
13.04.16
16:07
(5) Если сервер отправит на вебклиента сразу всю таблицу и далее скроллить средствами броузера или js в нем то будут тормоза.
Задача сделать отзывчивый интерфейс.
Чтобы да вебсервер (nodejs) отдавал данные из базы для вебклиента (HTML5 броузер) нужными порциями.
Причем какую порцию отдавать еще и "предвидел" по поступающим командам-запросам данных с клиента.
7 badboychik
 
13.04.16
16:07
(4) при прокрутке до 80% записей клиент запрашивает с сервера новую порцию и получив закидывает в таблицу
8 mingw
 
13.04.16
16:10
(7) Это если простейше. А хочется упредить. Чтобы в фоне подгрузка шла. Но без лишнего.
А куда старые данные. Для прокрутки назад. Как определять старость.

Т.е. может у кого уже есть подобный опыт.
9 badboychik
 
13.04.16
16:14
(8) запоминать начальную и конечную строку полученного набора, при прокрутке назад выбирать меньшие значения чем начальный номер
В фоне и будет идти пока пользователь оставшиеся 20% записей будет докручивать
10 badboychik
 
13.04.16
16:15
есть подход когда каждая следующая порция в 2 раза больше предыдущей, тогда реже приходится обращаться на сервер. И в 1С вроде такой же способ
11 mingw
 
13.04.16
16:19
(9) (10) ОК.
А если сортировка по полям таблицы. Сортировать на сервере? Как после сортировки текущей строкой сделать эту же. Или пофиг и сбрасываем.

Потом поиск по полю. Тоже на сервере сразу искать и нужный кусок отправлять?

Понятно что с отбором попроще. Кстати так и делал давно просто показ первых 100 записей и далее отбор на сервере.
12 trdm
 
13.04.16
16:19
Хорошая задачка для программиста.
Я бы повозился. Но таблица - таблице рознь.
13 badboychik
 
13.04.16
16:21
(11) условия отбора и сортировки передавать на сервер, конечно
14 Fragster
 
гуру
13.04.16
16:23
я забил и сделал без динамической подгрузки: http://fragster.ru/perfomanceTest/results.php
но вообще экспериментировал с отправкой на клиента размера (для рисования скролла) и текущего "фрэйма" + два "фрэйма" в обе стороны. Когда запас в какую-то сторону становился меньше одного фрэйма - подсасывал новые данные асинхронно. при этом дергать скролл можно было в любую сторону на любое расстояние - он показывал некоторое время пустую табличку, а потом в ней подгружались данные. ноде для этого не обязателен, работало на хттп-сервисах 1с + сериализация json
15 orefkov
 
13.04.16
16:43
Можно конечно послать изучать код реализации ТабличногоПоля и ПоставщикаДанныхODBC в 1С++, но это очень жестоко.

А так - согласно REST серверу вообще должно быть пофиг, что на клиенте.
Клиент должен посылать запросы, в которых указывать, которая порция данных ему нужна. Сервер должен выполнить запрос и вернуть данные. А вот как оптимально написать запрос, который получит именно порцию данных - это уже надо смотреть в каждом конкретном случае.
В 1С++ это решалось тем, что всегда был уникальный ключ упорядочивания в запросе, а клиент передавал значение ключа и направление выборки.
Например, получение справочника с сортировкой по наименованию:
Первый запрос, клиент не передает ключ:
select from ttt order by descr, id limit 100
Клиента скроллят, нужны данные, последний полученный ключ - "Варежки", 23
select
from ttt where descr>'Варежки' or (descr='Варежки' and id>23) order by descr, id limit 100
Клиента скроллят в конец:
select from ttt order by descr desc, id desc limit 100
Клиента скроллят перед 'яблоки', 113
select
from ttt where descr<'яблоки' or (descr='яблоки' and id<113) order by descr desc, id desc limit 100

Но не знаю, сможет ли постгресс правильно оптимизнуть эти условия и попасть в индекс.
16 orefkov
 
13.04.16
16:44
Блин, из-за звёздочек курсив включился.
17 sash-ml
 
13.04.16
17:42
https://datatables.net/examples/ajax/simple.html
хороший бесплатный JS Фреймворк для табличек, таких полно.
но это на фронте. Есть примеры со скролом.
18 mingw
 
13.04.16
18:44
(17) JS UI  фреймворком с гридами много.

Но хочется то нечто вроде как на vaadin
https://vaadin.com/elements/-/element/vaadin-grid
Lazy loading a large data set - ленивая загрузка из больших источников данных
19 trdm
 
13.04.16
18:49
(18) Там другой риск, будет подтягивать много данных - у браузера может оперативки не хватить. А принцып тот-же.
20 mingw
 
13.04.16
18:50
(19) Старые данные нужно из памяти броузера того. Потом если что снова.
21 trdm
 
13.04.16
19:03
Ну и как ты устаревшие данные отличишь от актуальных?
22 Карупян
 
13.04.16
19:08
вон ваадин говорит, что реюзинг дом, так что проблемы старых данных не должно быть
23 mingw
 
13.04.16
19:08
(21) По времени их непоказа на экране.
24 Карупян
 
13.04.16
19:09
(23) не вариант, можно очень быстро скролить
25 Карупян
 
13.04.16
19:09
кстати почему собственно ваадин не берешь?
26 Aceforg
 
13.04.16
19:15
(16) тест
не курсив * курсив * не курсив
27 mingw
 
13.04.16
19:15
(24) Скорость скроллинга можно учесть. Как параметр для старения.

(25) Попробую vaadin elements. Вдруг что другое есть.
28 Cyberhawk
 
13.04.16
19:50
(26) Это работает только у модераторов
29 romix
 
13.04.16
23:48
А по-моему скроллинг - зло. Сразу проблема с простановкой точной ссылки и поиском, если содержимое будет индексироваться.
30 mingw
 
13.04.16
23:55
(29) Не понял. А понял. Раздел/секцию поменяли. Был "Убийцы 1С".
31 mingw
 
14.04.16
00:02
Проблему для броузера решил.
В https://vaadin.com/docs/-/part/elements/vaadin-grid/datasources.html есть

grid.items = function(params, callback) {
  setTimeout(function() {
    callback(employees.slice(params.index, params.index + params.count));
  }, 400);
};
grid.size = employees.length;

На сервер буду передавать params.index (верхний видимый) и params.count (количество видимых).
Сервер по последовательности их заранее (упреждающее чтение) подготовит данные из БД. Далее будет отсылать сразу готовые данные без запроса к БД.

Еще можно сделать кэш на JS в броузере. В виде массива полученных данных. Куда складывается все пришедшее с сервера. И грид будет слайсить из этого кэш массива.
32 mingw
 
14.04.16
00:04
(31)+ Осталось придумать алгоритмы для сервера. По таблице ВремяЗапроса|ИндексНачальнойСтроки|КоличествоСтрок.
Предсказывать следующие данные которые будут запрошены.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой