Адаптация параметров URL-запроса при переходе между представлениями в Vaadin Flow

Мне любопытно: есть ли возможность изменить параметры URL-запроса при переходе от одного представления к другому обычным образом?

Какой у меня вариант использования? Я хотел бы добавить параметр запроса «реферер» к URL-адресу при переходе от представления A к представлению C. Это также должно быть сделано при переходе от представления B к C. Когда представление C открыто, есть какое-то действие, которое должно вернуться к предыдущий вид. Эта информация "предыдущего просмотра" затем может быть определена параметром запроса URL "реферер". Для конкретного примера это уже работает.

Более того, я хотел бы обобщить поведение с некоторыми аннотациями к классам представлений. Например. виды A и B снабжены моей аннотацией @ReferrerSource, а вид C - моей аннотацией @ReferrerTarget. Поэтому каждый раз, когда в моем приложении происходит навигация, я хотел бы рассмотреть эти аннотации представлений и по запросу добавить параметр запроса URL-адреса "реферер".

Это вообще возможно?


person Steffen Harbich    schedule 04.02.2020    source источник
comment
Вы пробовали использовать vaadin.com/docs/v14/ поток / маршрутизация /? Тем не менее, это очень похоже на использование браузера или API истории в запутанном виде?   -  person cfrick    schedule 04.02.2020
comment
Да, я пробовал использовать события навигации, но, насколько я понимаю, они не дают возможности изменять параметры запроса URL во время навигации. Обратный просмотр браузера может работать, но это кажется странным: считайте, что представление C является видом редактирования, а действие - сохранением. Сохранение сохранит объект и вернется в историю браузера. Переход вперед в истории браузера вернется в режим редактирования. Ощущается необычно.   -  person Steffen Harbich    schedule 05.02.2020


Ответы (1)


Представление источника реферера:
при переходе от представления вы можете сделать это с помощью метода UI.getCurrent().navigate(String location, QueryParameters queryParameters).
Или, если вы используете RouterLink для навигации, вы также можете установить параметры запроса: routerLink.setQueryParameters(QueryParameters queryParameters) .

Это не то, что можно сделать с помощью аннотации или интерфейса, так как это невозможно сделать в любом навигационном наблюдателе. Оптимально вы должны иметь возможность добавить параметр queryParameter реферера в BeforeLeaveEvent, но я не думаю, что вы еще можете это сделать (вы можете получить QueryParameters из него, но вы не можете их там редактировать).


Целевое представление реферера:
Вы можете прочитать параметры URL из beforeEnterEvent или afterNavigationEvent в представлении целевого реферера. Значение реферера, которое вы можете сохранить в поле представления и использовать, когда пользователь нажимает кнопку «предыдущее представление». Я не уверен, как вы могли бы сделать это с помощью аннотации, но это должно быть выполнено с помощью интерфейса, если вы хотите.

@Override
public void afterNavigation(AfterNavigationEvent event) {
    Map<String, List<String>> parameters = afterNavigationEvent.getLocation().getQueryParameters().getParameters();
    // TODO: check parameters for your referrer parameter, and save it in the view
}

Другое возможное решение - оставить QueryParameters в покое и сохранить предыдущее представление в области пользовательского интерфейса (точно так же, как вы недавно советовали в одном из ваших собственные ответы; P). Теперь, начиная с Vaadin 14, я действительно не уверен, как это работает, поскольку экземпляр пользовательского интерфейса перестраивается при навигации. Но я уверен, что есть хорошее решение, есть много дискуссий по этой теме на SO, форумах vaadin и vaadin github.

person kscherrer    schedule 05.02.2020
comment
Согласовано. Это варианты решения моей проблемы. Чтобы объединить ваши идеи с подходом на основе аннотаций, я создал свой собственный вспомогательный класс навигации, который имеет два метода: первый предназначен для навигации от реферера к цели (проверяет аннотацию @ReferrerSource в классе представления реферера), а второй - для навигации от цели обратно к рефереру (проверяет @ReferrerTarget аннотации к целевому классу представления). Спасибо за Ваш ответ. - person Steffen Harbich; 06.02.2020
comment
Что касается области действия пользовательского интерфейса: насколько мне известно, экземпляр пользовательского интерфейса перестраивается только тогда, когда навигация осуществляется не с помощью RouterLink, UI.getCurrent().navigate метода или истории браузера. Другие способы навигации, такие как нажатие F5 (когда @PreserveOnRefresh не установлен) в браузере, обычные ссылки или вызов URL-адреса непосредственно в браузере, вызовут запуск нового экземпляра пользовательского интерфейса. - person Steffen Harbich; 06.02.2020
comment
связанные: github.com/vaadin/flow/issues/8712, по-видимому, это изменяется с vaadin 17 - person thi gg; 20.07.2020