[РЕДАКТИРОВАТЬ] Решение в конце вопроса [/ EDIT]
Контекст
В настоящее время я борюсь за реализацию Component
, которая основана наSplitLayout
, который выглядит следующим образом:
Идея заключалась в том, что макет с class="outer"
(выделенная строка) будет заполнителем для содержимого, которое должно бытьзагружается, когда пользователь выбирает строку в Grid
.
"outer"-Layout
был добавлен к SplitLayout
рядом с сеткой и поэтому помечен slot='secondary'
.
Другой классссылается на 'outer'-Layout
с @Route(value = "details", layout = OuterLayout.class)
Нажав на запись Grid
, страница переходит к "grid/details"
.
Проблема:
Я ожидал, что Vaadin поместит содержимое аннотированного класса в 'outer'-Layout
, но вместо этого он добавит новую запись рядом с ним: Если я удаляю первый 'outer'-Layout
, Vaadin помечает второй какslot='secondary'
и его содержимое отображается: Его даже обновление в соответствии с выбранным в данный момент Gridentry...
Источники:
Splitlayout
@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*/
}
}
Я неправильно понял концепцию жизненного цикла?
Заранее спасибо
Решение
По предложению Тату Лунда я изменил реализацию по умолчанию 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()));
}
}
}