null

Icefaces: использование ace:dialog

В оригинальном наборе компонентов icefaces (ICE components) для создания всплывающих диалоговых окон использовался элемент ice:panelPopup. Как правило, его отображение управлялось атрибутами visible и rendered, задаваемыми в переменной управляемого бина. Например:

Код xhtml страницы

<ice:panelPopup visible="#{dialogWindow.opened}"
                            rendered="#{dialogWindow.opened}"
                            ...>

Код управляемого бина

@ManagedBean(name="dialogWindow")
@SessionScoped
public class PopupBean {
    private boolean opened = false;
    public PopupBean() {
        ...
    }
    public boolean getOpened() {
        return opened;
    }

    public void setOpened(boolean opened) {
        this.opened = opened;
    }

    public void toggleOpened(ActionEvent event) {
         opened = !opened;
    }

С появлением набора компонентов ACE Components был представлен ace:dialog, реализующий этот функционал. Однако, попытка управлять его состоянием способом, описанным выше скорее всего ни к чему хорошему не приведет - окно может не закрываться, отображаться одно поверх другого в бесконечном цикле, или блокировать страницу после закрытия (если было запущено в модальном режиме).

Причина заключается в том, что управление этим элементом, в отличие от старого, рекомендуется осуществлять на стороне клиента при помощи вызова JavaScript методов.

Код xhtml  страницы:

<ace:dialog id="dialog"
                header="..."
                widgetVar="popupDialog"
                closable="true"
                modal="true"
                draggable="false"
                showEffect="clip"
                hideEffect="fade"
                width="400">
...
</ace:dialog>

 <h:commandButton onclick="popupDialog.show();"/> <!-- показать окно -->
 <h:commandButton onclick="popupDialog.hide();"/>   <!-- скрыть окно     -->



Если закрытие окна не может инициироваться действием пользователя (например, окно используется для аплоада файлов на сервер и должно закрываться после завершения загрузки), то из управляемого бина можно вызвать JavaScript функцию на клиенте). Для этого достаточно одной строки:  

JavaScriptRunner.runScript(FacesContext.getCurrentInstance(), "popupDialog.show();");


Назад