3.5.1.1.2. Методы контроллеров

В данном разделе описаны некоторые методы базовых классов контроллеров экранов, которые можно вызывать или переопределять в коде приложения.

Общие для всех экранов методы
  • show() - отображает экран. Данный метод обычно вызывается после создания экрана, как описано в разделе Открытие экранов.

  • close() - закрывает экран с переданным значением StandardOutcome или объектом CloseAction. Например:

    @Subscribe("closeBtn")
    public void onCloseBtnClick(Button.ClickEvent event) {
        close(StandardOutcome.CLOSE);
    }

    Значение параметра доступно в BeforeCloseEvent и AfterCloseEvent, поэтому информация о причине закрытия экрана может быть получена в слушателях этих событий. Подробная информация об использовании этих слушателей приведена в разделе Выполнение кода после закрытия и возврат значений.

  • getScreenData() - возвращает объект ScreenData, в котором зарегистрированы все компоненты данных, объявленные в XML-дескрипторе экрана. Метод loadAll() этого объекта можно вызывать для срабатывания всех загрузчиков данных экрана:

    @Subscribe
    public void onBeforeShow(BeforeShowEvent event) {
        getScreenData().loadAll();
    }
  • getSettings() - возвращает объект Settings, который может быть использован для чтения и записи специфичных настроек, ассоциированных с экраном для данного пользователя.

  • saveSettings() - сохраняет настройки экрана, представляемые объектом Settings. Данный метод вызывается автоматически, если свойство приложения cuba.gui.manualScreenSettingsSaving установлено в false (что является значением по умолчанию).

Методы StandardEditor
  • getEditedEntity() - когда экран открыт, возвращает экземпляр редактируемой сущности. Это экземпляр, установленный в контейнере данных, указанном аннотацией @EditedEntityContainer.

    В слушателях InitEvent и AfterInitEvent данный метод возвращает null. В слушателе BeforeShowEvent данный метод возвращает экземпляр, переданный в экран для редактирования (позднее в процессе открытия экрана сущность перезагружается, и другой ее экземпляр устанавливается в контейнере данных).

Для закрытия экрана редактирования можно использовать следующие методы:

  • closeWithCommit() - валидирует и сохраняет данные, затем закрывает экран с StandardOutcome.COMMIT.

  • closeWithDiscard() - игнорирует несохраненные изменения и закрывает экран с StandardOutcome.DISCARD.

Если в экране есть несохраненные изменения в DataContext, при закрытии экрана отображается соответствующее сообщение. Вид данного сообщения можно настроить с помощью свойства приложения cuba.gui.useSaveConfirmation. Если экран закрывается методом closeWithDiscard() или close(StandardOutcome.DISCARD) то несохраненные изменения игнорируются без каких-либо сообщений.

  • commitChanges() - сохраняет изменения не закрывая экран. Данный метод можно вызвать из собственного слушателя события (например нажатия кнопки), или переопределить слушатель действия windowCommit, чтобы выполнить какие-либо операции после сохранения данных. Пример переопределения стандартного действия windowCommit:

    @Override
    protected void commit(Action.ActionPerformedEvent event) {
        commitChanges().then(() -> {
            // this flag is used for returning correct outcome on subsequent screen closing
            commitActionPerformed = true;
            // perform actions after the data has been saved
        });
    }

    Стандартная реализация метода commit() отображает сообщение об успешном сохранении. Ее можно отключить, вызвав метод setShowSaveNotification(false) при инициализации экрана.

  • Метод validateAdditionalRules() можно переопределить для выполнения дополнительной валидации перед сохранением данных. Данный метод должен сохранить информацию об ошибках валидации в переданном ему объекте ValidationErrors. Впоследствии эта информация будет отображена вместе с ошибками стандартной процедуры валидации. Например:

private Pattern pattern = Pattern.compile("\\d");

@Override
protected void validateAdditionalRules(ValidationErrors errors) {
    if (getEditedEntity().getAddress().getCity() != null) {
        if (pattern.matcher(getEditedEntity().getAddress().getCity()).find()) {
            errors.add("City name cannot contain digits");
        }
    }
    super.validateAdditionalRules(errors);
}
Методы MasterDetailScreen
  • getEditedEntity() - когда когда находится в режиме редактирования, возвращает экземпляр редактируемой сущности. Это экземпляр, установленный в контейнере данных компонента form. Если экран не в режиме редактирования, данный метод выбрасывает IllegalStateException.

  • Метод validateAdditionalRules() можно переопределить для выполнения дополнительной валидации перед сохранением данных, как описано выше для StandardEditor.