Я реализую компонент Vaadin на основе JavaScript, который должен будет отображать и обновлять относительно большой набор данных. Я делаю это, расширяя AbstractJavaScriptComponent
.Изменения частичного состояния для Vaadin's AbstractJavascriptComponent
Я стараюсь, чтобы JS-сторона была как можно более «тупой», делегируя взаимодействие пользователя с сервером с помощью RPC и обновляя общее состояние. Затем вызывается функция обертки соединителя JS onStateChange
с новым состоянием, что заставляет DOM обновляться соответствующим образом.
У меня есть 2 проблемы:
- Я не хочу, чтобы передать весь набор данных, каждый раз, когда небольшая часть обновляется.
- Я не хочу полностью перестраивать пользовательский интерфейс каждый раз.
Я могу решить вторую проблему, сохранив предыдущее состояние и сравнив его части, чтобы узнать, что изменилось и только внести необходимые изменения DOM. Но это все еще оставляет первую проблему.
Должен ли я прекратить использование механизма общего состояния Vaadin и вместо этого использовать RPC для передачи изменений в состояние?
Update: Я делал некоторые испытания, и это, безусловно, представляется, что общий государственный механизм Vaadin является ужасен с точки зрения эффективности:
Всякий раз, когда компонент вызывает getState()
для того, чтобы обновить некоторые свойства в (или даже не обновляя ничего), передается объект состояния . Единственный способ избежать этого, насколько я вижу, - не использовать механизм общего состояния и вместо этого использовать вызовы RPC для передачи клиенту определенных изменений состояния.
Есть некоторые проблемы с подходом RPC, которые необходимо будет устранить, например: если вы меняете значение несколько раз за один цикл запроса/ответа, вы не хотите делать вызов RPC несколько раз. Вместо этого вы хотите, чтобы только последнее значение отправлялось так же, как механизм общего состояния, только отправляет конечное состояние в ответ. Вы можете хранить грязные флажки для каждой части состояния, которую вы хотите отправить отдельно (или просто сохранить копию предыдущего состояния и сравнить), но затем вам нужно как-то вызвать вызов RPC в конце обработки запроса. Как это может быть сделано?
Любые идеи по этому поводу приветствуются!
Обновление 2:
Vaadin 8 фиксирует корневой выпуск: он посылает только измененные свойства состояния. Кроме того, он больше не вызывает onStateChange()
на JS-коннекторе, когда только выполняет вызов RPC (и не меняет состояние).
Точно ответ, который я искал. Когда «обманывать», не отправляя полное состояние при переопределении encodeState, существуют ли какие-либо оговорки относительно отсоединения и прикрепления? Например, если полное состояние должно быть отправлено после отсоединения и повторного подключения? – herman
К сожалению, на этот раз я должен отказаться от ответа. Причина в том, что невозможно предотвратить передачу полного состояния (и вызываемой функции 'onStateChange()' JS), поскольку 'AbstractComponent # beforeClientResponse (логический начальный)' вызывает 'getState()' повторно, отмечая соединитель как грязный. Конечно, мы можем переопределить, но я уверен, что код существует по какой-то причине. ИМО это ошибка Ваадина. – herman
Я подал [этот билет] (https://dev.vaadin.com/ticket/19828) на свой трекер. Мне нужно найти способ обойти это. – herman