Navigation Vaadin流:使用SplitLayout和@ParentLayout时导航中断(?)

Navigation Vaadin流:使用SplitLayout和@ParentLayout时导航中断(?),navigation,vaadin,vaadin-flow,vaadin12,Navigation,Vaadin,Vaadin Flow,Vaadin12,[EDIT]问题末尾的解决方案[/EDIT] 上下文 我目前正在努力实现一个组件,它基于拆分布局,如下所示: 其想法是,带有class=“outer”(突出显示的行)的布局将成为用户在网格中选择行时应该加载的内容的占位符 “外部”-布局被添加到网格旁边的SplitLayout,因此标记为slot='secondary' 另一个类使用@Route(value=“details”,Layout=OuterLayout.class)引用'outer'-Layout 通过单击网格的条目,页面将导航到“

[EDIT]问题末尾的解决方案[/EDIT]

上下文 我目前正在努力实现一个
组件
,它基于
拆分布局
,如下所示:

其想法是,带有
class=“outer”
(突出显示的行)的布局将成为用户在
网格中选择行时应该加载的内容的占位符

“外部”-布局
被添加到网格旁边的
SplitLayout
,因此标记为
slot='secondary'

另一个类使用
@Route(value=“details”,Layout=OuterLayout.class)引用
'outer'-Layout

通过单击
网格的条目
,页面将导航到
“网格/详细信息”


问题: 我希望Vaadin将带注释类的内容放在
'outer'-Layout
中,但它在旁边添加了一个新条目: 如果我删除第一个
'outer'-Layout
Vaadin将第二个标记为
slot='secondary'
,其内容将显示: 它甚至会根据当前选择的Gridentry进行更新


资料来源: 拆分布局

@Route(value = "grid", layout = ContentLayout.class)
@ParentLayout(ContentLayout.class)
public class MySplitLayout extends SplitLayout implements RouterLayout {
    private MyGrid grid;
    private MyDetailOuterLayout detailOuterLayout;

    public MySplitLayout() {
        setSizeFull();

        grid = new MyGrid();
        detailOuterLayout = new MyDetailOuterLayout();

        addToPrimary(grid);
        addToSecondary(detailOuterLayout);
    }
}
外部

@ParentLayout(MySplitLayout.class)
public class MyDetailOuterLayout extends FlexLayout implements RouterLayout{

    public MyDetailOuterLayout() {
        setClassName("outer");
    }
}
@Route(value = "grid/details", layout = MyDetailOuterLayout.class)
public class MyDetailLayout extends FlexLayout 
        implements HasUrlParameter<Integer>, BeforeEnterObserver
{
    public MonitorDetailLayout() {
        setClassName("inner");

        /* define data via URL*/
    }
}
内部

@ParentLayout(MySplitLayout.class)
public class MyDetailOuterLayout extends FlexLayout implements RouterLayout{

    public MyDetailOuterLayout() {
        setClassName("outer");
    }
}
@Route(value = "grid/details", layout = MyDetailOuterLayout.class)
public class MyDetailLayout extends FlexLayout 
        implements HasUrlParameter<Integer>, BeforeEnterObserver
{
    public MonitorDetailLayout() {
        setClassName("inner");

        /* define data via URL*/
    }
}

RouterLayout
在类似情况下使用的想法是,您需要覆盖
showRouterLayoutContent(..)
方法。当进行导航时,将调用此方法,并将导航到的内容放置到布局中。所以在你的例子中,我假设你需要一个路线目标,它包裹了网格

所以模式是这样的,例如,在你的主布局中,你需要一个内容持有者,这里是Div,但它可以是任何东西(比如SplitLayout,或者其他任何东西)

另外请注意,如果您正在使用
@Route(value=“…”,layout=ParentLayout.class)
注释,则不应将
@ParentLayout(ParentLayout.class)
与注释一起使用。您只需要对不是路由目标的类使用
@ParentLayout


这里有更多信息:这里:

非常感谢。我在问题的末尾添加了解决方案。顺便说一句,如果我省略
MySplitLayout
上的
@ParentLayout
注释,如果我导航到
“grid/details”
并删除
ContentLayout
及其父元素,它将成为根元素。