Добрый день!
Пытаемся прикрутить 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 раза для тех же параметров.
С уважением,
Глеб