Может ли класс, реализующий RouterLayout, также быть определен как @Route

#java #vaadin-flow #vaadin10

#java #vaadin-flow #vaadin10

Вопрос:

Я изучаю Vaadin Flow (Vaadin v10) и испытываю трудности с понятиями Route (@Route в качестве аннотации) и RouterLayout.

Из документации, которую я уже прочитал на веб-сайте Vaadin! Я не смог определить ответ на конкретный вопрос.

Может ли класс, реализующий RouterLayout, также быть определен как @Route?

 @Route("")
public class MainLayout extends Div implements RouterLayout {
}
  

Пожалуйста (если возможно), предоставьте ссылку на некоторую документацию. Насколько я понимаю, RouterLayout предназначен для отображения представлений в нем. Следовательно, при необходимости public void showRouterLayoutContent(HasElement content) метод может быть переопределен для создания желаемого макета. Таким образом, размещение аннотации @Route, которая по существу определяет представление, не имеет смысла смешивать с RouterLayout?

Или это так? Если RouterLayout можно использовать с аннотацией @Route, предполагающей, что макет также является представлением; Может ли кто-нибудь предоставить мне простой сценарий, где это может быть полезно?

Ответ №1:

Как вы и сказали — на концептуальном уровне кажется странным иметь оба @Route и RouterLayout в одном классе. @Route аннотации размещаются на конечных узлах. У вас может быть автономный @Route , который будет помещен в <body> элемент, или у вас может быть вложенный макет, где маршрут отображается внутри одного или нескольких родительских макетов. Родительский макет может быть указан со вторым параметром аннотации, например с

 @Route(value = "users", layout = Dashboard.class)
public class Users extends Div {
//...
  

, где Dashboard необходимо реализовать RouterLayout . Таким образом, вы получили бы доступ к этому маршруту с помощью http://server-address-here/users , и он отображался бы Users внутри Dashboard .

Если вы хотите иметь более описательный URL, вы могли бы реализовать это с @RoutePrefix аннотацией на Dashboard :

 @RoutePrefix("dashboard")
public class Dashboard extends VerticalLayout implements RouterLayout { 
// ...
  

и теперь вы получите Users представление из http://server-address-here/dashboard/users , в то время как в остальном все останется таким же, как раньше.

Комментарии:

1. спасибо за разъяснение. Не могли бы вы любезно указать мне на официальную документацию Vaadin / учебное пособие (что угодно как таковое), в котором четко указано, что нет смысла использовать @Route аннотацию при реализации класса RouterLayout .

2. Я не уверен, что такая документация существует. Зачем вам это нужно?

3. Мы находимся в процессе обновления кода Vaadin7 до Vaadin10. Много кода было перенесено таким образом, что не соблюдается разделение задач между макетами и представлениями. Поскольку не существует документации, в которой четко указывается этот макет, а не фактические представления, стало очень сложно аргументировать создание четкой архитектуры для нового приложения. Я принимаю ваш ответ здесь и благодарю вас за то, что уделили время. Однако было бы здорово, если бы такая концепция была четко упомянута в официальной документации. 🙂