В настоящее время у меня есть класс, работающий в качестве основного маршрута моего приложения, который называется DetailView :
@Route
public class DetailView extends AppLayout {
private DataRepository repository;
public DetailView (DataRepository repository) {
this.repository = repository;
addListener(DateAddedEvent.class, comp -> {
System.out.println("test");
});
setContent(new Overview());
}
}
Обзор - это содержимое AppLayout . Этот компонент содержит несколько других компонентов:
@Tag("overview")
public class Overview extends VerticalLayout {
public Overview() {
setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN);
setDefaultHorizontalComponentAlignment(FlexComponent.Alignment.STRETCH);
add(new DateGrid()));
add(new GameSelection()));
}
}
DateGrid создаст несколько блоков в течение следующих 28 дней:
public class DateGrid extends Div{
public DateGrid() {
LocalDate now = LocalDate.now();
VerticalLayout verticalLayout = new VerticalLayout();
for (int i = 0; i < 4; i++) {
HorizontalLayout horizontalLayout = new HorizontalLayout();
for (int j = 0; j < 7; j++) {
DayBlock dayBlock = new DayBlock(now.plusDays(j + 7 * i));
dayBlock.addClickListener((event -> fireEvent(new DateAddedEvent(this,false))));
horizontalLayout.addAndExpand(dayBlock);
}
verticalLayout.add(horizontalLayout);
}
add(verticalLayout);
}
}
При нажатии на блок будет уволить DateAddedEvent . Это событие может быть перехвачено обработчиком событий в самом классе DateGrid . Если я хочу получить доступ к этому событию в родительском классе DateGrid (Обзор), мне нужно было добавить метод ComponentEventListener следующим образом:
public Registration addDateAddedEventListener(ComponentEventListener<DateAddedEvent> listener) {
return addListener(DateAddedEvent.class, listener);
}
Теперь я могу подключите слушателя в Overview :
DateGrid dateGrid = new DateGrid()
dateGrid.addDateAddedEventListener((event) -> System.out.println("test") );
add(dateGrid);
Что отлично работает. Но в этом случае я хотел бы прослушать DateAddedEvent в классе DetailView , который имеет DataRepository с автопроводкой.
Я не хочу делать какие-либо компоненты управляемыми bean-компонентами (добавив @SpringComponent @UIScope) и не хочу передавать слушатели или репозитории через мои компоненты Vaadin (я хочу, чтобы они использовались повторно и развязано.)
Как мне подойти к этому? Мне кажется, что я, вероятно, смотрю на это неправильно. Я могу найти только примеры онлайн, где они добавляют слушателей от родителя к ребенку, но никогда больше уровней.