Как использовать переменные / методы класса макета маршрутизатора в другом классе в Vaadin? - PullRequest
0 голосов
/ 12 февраля 2020

Я использую Ваадин 14.0.3 . У меня есть класс MainLayout с методом someCode. Я использую этот класс в качестве макета для другого класса с именем MainView. Можно ли использовать метод someCode в MainView? Вот пример:

public class MainLayout {
    public void someCode() {
    }
}

@Route(value = "main", layout = MainLayout.class)
public class MainView { 
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

В моем приложении я использую подход, описанный в ответе Эрика (получить родительский компонент во время onAttach перенаправленного просмотра). Однако я немного его расширил и использую интерфейсы для предотвращения дублирования кода. Вот мои настройки:

public class MainView extends HorizontalLayout implements RouterLayout {
    public MainView(){
        ...
    }

    public interface Retriever extends HasElement {
        default MainView getMainView() {
            Component parent = getElement().getComponent().orElse(null);
            while (parent != null && !parent.getClass().equals(MainView.class)) {
                parent = parent.getParent().orElse(null);
            }
            return (MainView)parent;
        }
    }
}
@Route("main")
public class MainRoute extends VerticalLayout implements MainView.Retriever {

    public MainRoute(){
        ...
    }

    @Override
    public void onAttach(){
        MainView mainView = getMainView();
        if (mainView != null){
            mainView.someCode(); // do with the mainView what you want here
        } else {
            LOGGER.error(...);
        }
    }
}

обратите внимание, что мой routerLayout называется MainView, а не MainLayout. Я не хотел менять это имя, так как имя «MainView» используется для размещения маршрутизатора в большинстве официальных документов и примеров

0 голосов
/ 12 февраля 2020

Возможно, это не обязательно хорошая практика, поскольку она очень тесно связывает классы.

Тем не менее, если вы используете Spring, вы можете сделать MainLayout компонентом UIScoped Spring и autowire это в MainView.

В противном случае вам придется использовать метод getParent () и привести результат к MainLayout.

@Override
public void onAttach(AttachEvent event) {
    Optional<Component> parent = getParent();
    while (parent.isPresent()) { 
        Component p = parent.get();
        if (p instanceof MainLayout) {
            MainLayout main = (MainLayout) p;
            main.hello();
        }           
        parent = p.getParent();
    }
}
...