0

我正在为我的应用程序使用 vaadin 14。我的 MainView 类扩展了 Applayout 类。这使我可以使用 addToNavBar(true, some Components) 函数将导航栏添加到您的应用程序。

现在,在我的主视图中,在导航栏中,我填充了注册和登录按钮。如果单击这些按钮,我使用 addonclick 侦听器委托其他视图,例如登录和注册。在这些视图更改期间,顶部的导航栏仍然保留在那里。但是,如果用户登录或注册,我想删除导航栏中的这些登录和注册按钮,并将它们替换为位于导航栏中的个人资料图片图标。但是,从子视图(注册,登录)我找不到使用 vaadin 14 访问导航栏的方法。因此,如何从子视图访问和更改导航栏的内容?

public class MainView extends AppLayout {
private static final long serialVersionUID = 1L;
private final Tabs menu;
private HorizontalLayout headerLayout;

public MainView() {
    setPrimarySection(Section.NAVBAR);
    headerLayout = createHeaderContent();
    addToNavbar(true, headerLayout);
    setDrawerOpened(false);
    menu = createMenu();
    addToDrawer(createDrawerContent(menu));
}

private HorizontalLayout createHeaderContent() {
    headerLayout = new HorizontalLayout();
    headerLayout.setId("header");
    headerLayout.getThemeList().set("dark", true);
    headerLayout.setWidthFull();
    headerLayout.setSpacing(false);
    headerLayout.setAlignItems(FlexComponent.Alignment.CENTER);
    headerLayout.add(new DrawerToggle());
    headerLayout.add(createWebsiteName());
    headerLayout.add(createMiddleSpacingInHeader());
    headerLayout.add(createLoginAndRegisterButtons());

    return headerLayout;
}

private Component createLoginAndRegisterButtons() {
        HorizontalLayout layout = new HorizontalLayout();
        layout.setPadding(true);
        layout.setSpacing(true);
        layout.setAlignItems(Alignment.STRETCH);

        Button register = createRegisterButton();
        Button login = createLoginButton();
        Image loggedInUserPicture = createLoggedInUserImage();

        layout.add(register, login, loggedInUserPicture);

        return layout;
    }
4

1 回答 1

1

目前没有很好的 API。一个原因是框架需要与您如何构建菜单无关。我通过创建这种小界面解决了这个问题

public interface HasTabsAccessor {
    
    public default Tabs getTabs(Component component) {
        Optional<Component> parent = component.getParent();
        Tabs menu = null;
        while (parent.isPresent()) { 
            Component p = parent.get();
            if (p instanceof MainLayout) {
                MainLayout main = (MainLayout) p;
                menu = main.getMenu();
            }           
            parent = p.getParent();
        }
        return menu;
    }
}

然后我可以将其添加到需要访问菜单的视图中。

    @Route(value = FormLayoutView.ROUTE, layout = MainLayout.class)
    @PageTitle(FormLayoutView.TITLE)
    public class FormLayoutView extends VerticalLayout implements BeforeLeaveObserver, HasTabsAccessor {
...

然后只是getTabs()在视图中使用。

于 2020-08-31T13:21:38.077 回答