Добрый день!
Пытаемся прикрутить lazy load на раскрытие узлов иерархии. Чтобы при изначальном открытии подгружались только корневые узлы, а потомки догружались уже при открытии. Но если загрузить только корневые, а их потомков не грузить, то экспандер просто не появляется и событие ExpandEvent не получается инициировать. Есть ли какой-то способ сделать узел принудительно раскрываемым? Или как-то иначе решить проблему загрузки большой иерархии
Попробуйте метод TreeDataGrid#expandRecursively(Collection, int).
В нем второй параметр отвечает за глубину раскрытия.
Добрый день.
У нас есть небольшой пример, как можно загружать данные частями, по мере того как они будут требоваться компоненту TreeDataGrid. Проект можно найти на GitHub.
Что входит в состав проекта:
-
Task- тестовая иерархическая сущность. -
LazyTreeDataGrid- расширение компонентаTreeDataGrid, необходимое, чтобы создавать специальную реализациюDataProviderдля внутреннего Vaadin компонента. -
LazyHierarchicalDataGridDataProvider- является связующим звеном между Vaadin API и Jmix API и делегирует загрузку данных переданному объектуLazyTreeDataGridItems. -
LazyTreeDataGridItems- интерфейс, реализацию которого необходимо передавать в методsetItemsкомпонентаTreeDataGrid. Именно он выполняет работу по загрузке данных.
Регистрация LazyTreeDataGrid происходит в LazyTreeComponentApplication путем создания бина ComponentRegistration.
В контроллере экрана TaskBrowse создана примерная реализация LazyTreeDataGridItems - TaskLazyTreeDataGridItems. Данные загружаются с помощью DataManager, каждый раз, как они запрашиваются компонентом TreeDataGrid. Главным методом является fetchChildren. Ниже его реализация:
@Override
public Stream<Task> fetchChildren(HierarchicalQuery<Task, SerializablePredicate<Task>> query) {
List<Task> list = dataManager.load(Task.class)
.query("select e from demo_Task e where e.parent = :parent")
.parameter("parent", query.getParent())
.sort(sort)
.firstResult(query.getOffset())
.maxResults(query.getLimit())
.list();
log.info("Loaded: {} items", list.size());
return list.stream();
}
Данная реализация является лишь примером и требует доработки и оптимизации. Например кэширование, т.к. Vaadin при определенных условиях вызывает fetchChildren по 2 раза для тех же параметров.
С уважением,
Глеб