Vaadin 14 / Spring Boot - Как слушать события, запускаемые вложенными компонентами - PullRequest
0 голосов
/ 26 января 2020

В настоящее время у меня есть класс, работающий в качестве основного маршрута моего приложения, который называется 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 (я хочу, чтобы они использовались повторно и развязано.)

Как мне подойти к этому? Мне кажется, что я, вероятно, смотрю на это неправильно. Я могу найти только примеры онлайн, где они добавляют слушателей от родителя к ребенку, но никогда больше уровней.

...