0

我正在使用Vaadin 14.0.3。我有一个MainLayout方法类someCode。我正在使用这个类作为另一个名为MainView. someCode是否可以在中使用该方法MainView?这是示例:

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

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

谢谢!

4

2 回答 2

0

有可能,但这不一定是一个很好的实践,因为它非常紧密地结合了类。

也就是说,如果您使用的是 Spring,则可以将 MainLayout 设置为 UIScoped Spring 组件并在 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();
    }
}
于 2020-02-12T06:06:10.117 回答
0

在我的应用程序中,我使用 Erik 的回答中描述的方法(在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”用于大多数官方文档和示例中的路由器布局

于 2020-02-12T10:23:20.727 回答