4. Настройка взаимодействия между экранами
Пользователь должен иметь возможность изменять и сохранять базовое местоположение, щелкая на маркере карты. На данный момент наше приложение не предоставляет эту функциональность.
Перейдите к контроллеру экрана LocationLookupView и создайте методы setter и getter для передачи местоположения, которое мы хотим отобразить или сохранить.
public Location getSelected() {
return selected;
}
public void setSelected(@Nullable Location selected) {
this.selected = selected;
currentLocationField.setValue(selected);
if (selected != null) {
setMapCenter(selected.getBuilding());
}
}
Перейдите к контроллеру экрана UserDetailView и найдите обработчик onLocationFieldSelect(). Наша цель - не только открыть диалог, но и передать ранее сохраненное местоположение для редактируемого пользователя. Кроме того, нам нужно получить результат из диалога после его закрытия. Давайте внесем необходимые изменения в обработчик:
@ViewComponent
private JmixValuePicker<Location> locationField;
@Subscribe("locationField.select")
public void onLocationFieldSelect(final ActionPerformedEvent event) {
dialogWindows.view(this, LocationLookupView.class)
.withAfterCloseListener(closeEvent -> {
if (closeEvent.closedWith(StandardOutcome.SELECT)) {
locationField.setValue(closeEvent.getView().getSelected()); (1)
}
})
.open()
.getView()
.setSelected(getEditedEntity().getLocation()); (2)
}
| 1 | Объект AfterCloseEvent содержит CloseAction, переданный в метод close() экрана. Мы анализируем действие закрытия с помощью метода closedWith() объекта события. Помните: в предыдущем разделе мы установили обработчик для действия select. |
| 2 | Передает местоположение редактируемого пользователя в setter LocationLookupView. |
Запустите приложение и убедитесь, что взаимодействие между UserDetailView и LocationLookupView настроено правильно.