Создание GraphQL-подписки
Формулировка задачи
Отображать обновленные данные на экранной форме приложения для всех пользователей приложения при изменении данных одним из пользователей.
Предварительные требования
Создан проект ProjWithSubscription. Настроена модель безопасности.
В разрабатываемом проекте создана модель данных, в которой описан класс Class.
Разработана экранная форма ClassPage с компонентом DataGrid для отображения данных класса Class. Для экранной формы ClassPage настроены сущности:
- действие getClass для получения данных класса Class;
- источник данных на основе действия getClass;
- параметры маршрутизации
/SomeApp
,SomeApp
.
Проект опубликован. В базу данных добавлены данные.
Рекомендуемое решение задачи
Рекомендуемый подход к решению описанной задачи включает следующие шаги:
-
Включение подписки на класс, изменение данных которого нужно отслеживать.
Откройте окно настройки класса Class и установите флажок Формировать подписки GraphQL.
-
Создание действия для обработки события изменения данных класса.
В то время, когда файл описания экранной формы ClassPage открыт, создайте действие типа GraphQL с именем Subscribe_to_Class и в окне настройки действия установите флажок GraphQL-подписка.
Откройте окно Конструктор GraphQL и введите следующий текст GraphQL-запроса:
subscription sub1 {
ProjWithSubscription_class {
operationType
idType
projectName
className
}
}Каждое сообщение об изменении данных класса Class будет содержать информацию о типе операции operationType (INSERT, UPDATE, DELETE), типе уникального идентификатора класса idType, имени проекта projectName и имени класса className.
-
Вызов метода, реализующего подписку GraphQL на созданное действие.
В то время, когда файл описания экранной формы открыт, перейдите в кодовый режим Редактора Форм и в секции Scripts добавьте следующий блок кода:
Scripts={[
() => {
const handleReq = async (param) => {
console.log('handle req', param); // вывод уведомления об изменении данных класса
const dataSourceTest = getDataSource("getClass");
await dataSourceTest.load(); // вызов действия для обновления данных в таблице с данными
}
const handleClose = (message) => {
console.log('handle close', message); // вывод сообщения о разрыве соединения
}
const extraParams = {
onMessage: handleReq,
onClose: handleClose
}
executeAction('Subscribe_to_Class', extraParams);
}
]}