Взаимодействие с сервером#

Модель данных#

Позволяет передавать состояние для отображения с сервера на клиенте.

Модель данных интегрировано с событиями react таким образом, react компоненты могут подписываться на изменения модели данных.

К примеру модель данных для дашборда:

  • Таблица

    • Колонки

      • Колонка

        • Атрибуты колонки

          • Ширина

    • Строки

    • Ячейки

      • Ячейка

        • Атрибуты ячейки

          • Видимость

          • Текст для отображения

          • Количество строк

          • Количество колонок

События модели на который можно подписаться на стороне клиента:

  • На изменения свойств

  • На изменение дочерних элементов

  • На перестроение узла
    При перестроение узла на клиенте, событие приходит только в узел перестроения, дочернии элементы должны быть обновлены в результате перестроения узла и события по ним не приходят. Это позволяет ускорить массовое перестроение элементов без дос атаки событиями.

Действия с моделью на стороне сервера:

  • Создать узел модели

  • Изменить свойство узла модели

  • Сменить ветку узла модели
    При этом на стороне клиента произойдет событие изменения дочерних элементов для родительского узла.
    Данная операция позволяет гарантировать согласованное изменение данных на клиенте, так как для данного узла будет создана отдельная копия данных для отображения(при этом по сети будут переданы только изменения).

Местоположение данных#

На сервере#

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

На клиенте#

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

При таком взаимодействии данные на клиент приходят только по запросу клиента:

  • на пользовательские действия

  • на обработку изменений модели

Датасет#

Позволяет хранить изменения модели данных и отправлять их на сервер. Датасет интегрирован в модель данных и на прямую используется только при отправки изменений на сервер. Пример отправки смотрите в разделе Данные ввода.

Данные ввода#

Позволяет передавать изменения с клиента на сервер.

Данные ввода попадают Abi.onInputData

Данные для ввода синхронизируются с серверной частью перед выполнением любой синхронной операции.

Синхронными операциями являются:

  • Выполнение операции выборки

  • Синхронный запрос

Для синхронизации данных ввода, с сервером используется понятие маркер ввода.

Маркер ввода#

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

Маркер ввода по своей сути повторяет концепцию фокуса ввода, однако есть ряд отличий:

  • Маркер ввода поддерживает асинхронные методы для операций.

  • Маркер ввода, учитывается на уровне всего компонента

  • Маркер ввода запрашивается перед началом редактирования, в то время как фокус ввода меняется при любой навигации

Запрос маркера ввода#

Перед начало изменения данных ввода, контрол обязан запросить маркер ввода. При этом:

  1. Если маркер ввода находится в другом контроле

    1. Происходит запрос маркера ввода с другого контрола

    2. Если другой контрол отменяет запрос, происходит возврат ошибки
      При этом инициатор запроса должен отменить текущую операцию

    3. Если другой контрол готов вернуть маркер ввода

      1. Формируются данные ввода для синхронизации с серверной частью для другого контрола

      2. Данные ввода синхронизируются с сервером

      3. Новый маркер ввода возвращается в запросивший контрол.

Пример установки значения в контексте маркера ввода:

<input type="checkbox" 
       checked={cell.getAttrValue("isSelected")} 
       onChange={function(event){
          controller.withInputMarker(function(){
            cell.setAttrValue("isSelected",!event.target.checked)
          }).catch(function(){
            console.log("cancel input")
          })
        }}
/>

Запрос возврата маркера ввода#

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

При этом:

  1. Если текущий контрол не может завершить формирование данных ввода
    К примеру дата введена не полностью, и данные ввода находятся в недостоверном состоянии

    1. Текущий контрол отменяет запрос

  2. Иначе

    1. происходит формирование данных для ввода

    2. Сформированные данные отправляются на сервер

Пример:

this.controller.onCompleteInputMarker = (inputMarker)=>{
  const cds =  this.controller.localContext["cellsDataSet"] as NDataSet.NDataSet
  const curChNumber = cds.getCurChNumber()
  this.controller.coreController.postInputData(inputMarker,{
      data: cds.buildChanges()
  }).finally(()=>{
      cds.clear(curChNumber)
  })
}

Rpc#

Позволяет вызывать запрос в ABI.

Запросы попадают в ru.bitec.app.gs3.test.extctrl.Gs3_ExtControlExampleCbi#onRequest

Синхронные вызовы#

Передает запрос в CBI гарантируя синхронизацию данных ввода перед началом выполнения запроса.

Перед началом выполнения синхронной операции, открытый маркер ввода закрывается.

Асинхронные вызовы#

Передает запрос в CBI, без синхронизации данных ввода

Согласованность изменений#

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