GWT: Как запретить обработчику получать событие, пока пользователь не выберет выбор в окне подтверждения? - PullRequest
0 голосов
/ 25 мая 2011

Это потребует некоторых объяснений.

В нашем проекте есть всплывающее окно, в котором есть несколько полей, которые можно редактировать, а также кнопки «Сохранить» и «Отмена» внизу. Нажатие Сохранить, очевидно, сохранит все сделанные вами изменения или просто закроет всплывающее окно, если изменений нет. Отмена также закроет всплывающее окно, если нет изменений. Если вы отменяете изменения, появляется диалоговое окно с запросом подтверждения того, действительно ли вы хотите отменить внесенные изменения.

Идея состоит в том, что если вы нажмете Нет, диалоговое окно подтверждения закроется, но всплывающее окно не будет, поскольку пользователь указал, что не хочет отменять эти изменения.

Проблема сейчас в том, что всплывающее окно закрывается сразу после нажатия кнопки «Отмена», даже если были внесены изменения. Диалоговое окно подтверждения также появляется, но оно не очень полезно, так как всплывающее окно уже исчезло.

Причина, по которой это происходит, заключается в том, что обработчики для закрытия всплывающего окна и отображения диалогового окна подтверждения прикреплены как обработчики щелчков к кнопке Отмена. Раньше это работало до того, как GWT переключился на обработчики, потому что мы передали список слушателей в качестве параметра методу, который показал диалоговое окно подтверждения. Тогда мы будем запускать этих слушателей только в том случае, если пользователь решит, что все в порядке, чтобы изменения были отменены. Поскольку я не контролирую обработчики с момента изменения модели событий (они содержатся в коде виджета GWT), я больше не могу этого делать.

Моя идея исправить это состояла в том, чтобы просто добавить обработчик, закрывающий всплывающее окно, к другому событию, которое будет запускаться только при выборе правильной опции в диалоговом окне подтверждения. Единственная причина, по которой я задаю этот вопрос, состоит в том, чтобы посмотреть, есть ли другой способ сделать это, потому что вся эта вещь, в которую добавлен обработчик закрытия всплывающих окон, обрабатывается в наших макетах xml, и для этой работы потребуются некоторые интересные архитектурные изменения. должным образом.

: BeforePopupClosedEvent запускается, что открывает диалоговое окно подтверждения. Если пользователь указывает, что изменения не должны быть отменены, BeforePopupClosedEvent отменяется. К сожалению, код продолжает выполняться в ожидании ответа пользователя, и обработчик, который закрывает всплывающее окно, продолжает это делать, потому что пользователь еще не выбрал выбор.

1 Ответ

0 голосов
/ 25 мая 2011

Это предварительный набросок виджета, который я сделал для решения этой проблемы.Позже я создал более общий подкласс обтекания SimplePanel, который бы обернул обработчики щелчков любого виджета.

Он работает путем переключения замещающего HandlerManager при вызове addClickHandler и запускает только события, происходящие вдоль этого HandlerManager, когдаОткроется диалоговое окно подтверждения.

public class ConfirmButton extends Button
{
    private HandlerManager handlerManager = new HandlerManager(this);
    private String message = "Do you really want to do this?";
    private ClickHandler myRealClickHandler = new ClickHandler() {

        @Override
        public void onClick(ClickEvent event)
        {
            if (Window.confirm(message)) handlerManager.fireEvent(event);
        }
    };

    public ConfirmButton()
    {
        super();
        addDomHandler(myRealClickHandler, ClickEvent.getType());
    }

    public ConfirmButton(String text)
    {
        this();
        setText(text);
    }

    public void setConfirmationPrompt(String prompt)
    {
        message = prompt;
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler)
    {
        HandlerRegistration ret = handlerManager.addHandler(ClickEvent.getType(), handler);
        return ret;
    }
}
...