Добрый день!
Контекст:
У меня есть экран редактирования (detailView). Помимо обычных полей, на нем есть dataGrid, некоторые колонки которого используют ComponentRenderer для отображения компонентов (CheckBox, EntityComboBox и т.д.).
Известное поведение (и моя попытка решения):
Как мы знаем, при изменении значения в компоненте (например, CheckBox) и переходе на другую страницу пагинации, при возврате обратно значения сбрасываются к исходным из БД. Это происходит потому, что при навигации по страницам срабатывает DataLoader, который перезаписывает DataContainer данными из БД, и ComponentRenderer заново создает компоненты с этими “свежими” значениями.
В Jmix 1.x для решения этой проблемы мы использовали такой подход: перед созданием компонента сначала проверяли наличие измененной сущности в DataContext с помощью dataContext.find(). Это позволяло отображать несохраненные правки пользователя, что было очень удобно — не требовалось постоянно сохранять каждое изменение в таблице; все накопленные правки фиксировались разово по нажатию кнопки “ОК”.
Проблема в Jmix 2.4:
Я обнаружил, что в Jmix 2.4 изменения тоже попадают в DataContext, но они теряются при возврате на предыдущую страницу пагинации.
Пример и наблюдения:
Для начала захожу в раздел users тестового проекта, выбираю пользователя admin и нажимаю редактировать.
- Нахожусь на странице 1 dataGrid, изменяю значение CheckBox с false на true.
- Перехожу на страницу 2. Через Debug вижу, что DataContext содержит измененную сущность со значением true.
- Возвращаюсь на страницу 1. Перед генерацией ComponentRenderer снова проверяю DataContext — значение свойства сущности в нем изменилось обратно на false.
- Пытался отследить это через DataContext.ChangeEvent, но он не фиксирует никаких изменений DataContext в момент возврата на страницу.
Ключевой вопрос:
Почему состояние DataContext меняется при навигации по страницам DataGrid? Куда и почему пропадают несохраненные изменения из контекста? Это поведение отличается от Jmix 1.x, и я не могу найти причину.
Прикладываю тестовый проект для проверки - GitHub - ShafirSharifullin/test-project