Navigation Vaadin流:使用SplitLayout和@ParentLayout时导航中断(?)
[EDIT]问题末尾的解决方案[/EDIT] 上下文 我目前正在努力实现一个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 通过单击网格的条目,页面将导航到“
组件
,它基于拆分布局
,如下所示:
其想法是,带有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
及其父元素,它将成为根元素。