



Хотя кажется, что показывать уведомление очень важно, это все равно является частью состояния пользовательского интерфейса; поэтому, когда вы перезагружаете, вы по сути (пере) создаете новый государство, частью которого уведомление не является.
Вы должны подать сигнал «новому» пользовательскому интерфейсу, что вы хотите, чтобы что-то было сделано.
Один из способов сделать это — сохранить маркер внутри сеанса (где все пользовательские интерфейсы часть). Затем используйте наблюдателя для компонента (или слушателя для всего вашего компонента). приложение), чтобы после завершения навигации разрешить уведомление.
Например.
@Route(value = "", layout = MainLayout)
@SuppressWarnings('unused')
class MainView extends Composite<Div> implements AfterNavigationObserver {
public static final String RELOADED_KEY = 'reloaded'
MainView() {
content.add(
new Button("Reload and notify", {
getUI().get().tap {
getSession().setAttribute(RELOADED_KEY, true)
getPage().reload()
}
})
)
}
@Override
void afterNavigation(AfterNavigationEvent afterNavigationEvent) {
def session = getUI().get().getSession()
if (session.getAttribute(RELOADED_KEY)) {
session.setAttribute(RELOADED_KEY, false)
Notification.show('Reloaded...')
}
}
}
Если вы хотите наблюдать за событием реферирования и предпринимать какие-либо действия, когда это происходит, вам необходимо сохранить пользовательский интерфейс при обновлении. В противном случае пользовательский интерфейс создается заново, как описано в ответе @cfrick выше.
Способ сделать это — аннотировать представление с помощью @PreserveOnRefresh. Затем реализуйте интерфейс BeforeEnterObserver.
Это дает вам метод beforeEnter, который вы можете переопределить, чтобы показывать уведомление при обновлении.
@Override
public void beforeEnter(BeforeEnterEvent event) {
if (event.isRefreshEvent()) {
Notification.show("Hello there");
}
}
Делает что-л. типа
UI.getCurrent().getPage().executeJs("window.location.reload();").then(val -> {new Notification("Success", 5000).open();});работа?