[编辑] 问题结束时的解决方案 [/编辑]
语境
我目前很难实现一个Component
基于如下所示的SplitLayout
:
这个想法是带有class="outer"
(突出显示的行)的布局将成为内容的占位符,当用户在Grid
.
被"outer"-Layout
添加到SplitLayout
网格旁边,因此标有slot='secondary'
。
另一个类引用'outer'-Layout
with@Route(value = "details", layout = OuterLayout.class)
通过单击Grid
页面的条目导航到"grid/details"
。
问题:
我希望 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*/
}
}
我误解了生命周期的概念吗?
先感谢您
解决方案
正如 Tatu Lund 所建议的,我修改了RouterLayout
这样的默认实现:
@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);
}
@Override
public void showRouterLayoutContent(HasElement content) {
if (content != null) {
Element rootElement = getElement();
rootElement.removeChild(detailOuterLayout.getElement()); // aka the secondary Element
rootElement.appendChild(Objects.requireNonNull(content.getElement()));
}
}
}