如何重置p:dialog以及所包含组件的禁用状态?

时间:2019-01-25 16:07:23

标签: jsf primefaces

Primefaces 4.0

我需要重置p:dialog中包含的组件的初始禁用状态。 下面的简化示例显示了该问题:

XTML:

<p:dialog header="header" widgetVar="dialog" appendTo="@(body)"
          modal="true" resizable="false">
    <h:form id="form">
         <p:inputText value="#{bean.text}" id="text" />
         <p:commandButton value="Disable InputText" 
                          action="#{bean.disableInputText}" />
         <p:commandButton value="Cancel"
                                 action="#{bean.cancelDialog}"
                                 process="@this"
                                 update="@form" immediate="true">
            <p:resetInput target="@form"/>
        </p:commandButton>
    </h:form>
 </p:dialog>

ManagedBean:

 @ViewScoped
 public class Bean {
      public void disableText() {
         final FacesContext context = FacesContext.getCurrentInstance();
         final UIViewRoot root = context.getViewRoot();
         final UIComponent component = root.findComponent(":text");
         if (uiComponent instanceof InputText) {
             ((InputText) uiComponent).setDisabled(true);
         }
      }

      public void cancel() {
           // reset disable-state of the disable-state of all components in a generic way.
      }
 }

使用对话框时,可以禁用p:inputText元素。如果对话框已取消并再次打开,则不应禁用inputText。初始状态应该已经恢复。请注意,此示例已简化,我正在寻找一种通用解决方案,该解决方案也可用于具有10个以上输入元素的公式编写器。

1 个答案:

答案 0 :(得分:3)

一般(也是最广泛的)解决方案

对于一般解决方案,您可以使用Java Server Faces中可用的状态保存功能。以您的代码示例为基础(进行一些小的更改以清除内容),下面的示例使用状态保存并还原组件的先前状态; <​​/ p>

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Disable Test</title>
    </h:head>
    <h:body>

        <p:dialog  header="header" widgetVar="dialog" appendTo="@(body)" modal="true" resizable="false">
            <h:form id="form">
                <p:inputText value="#{disableTestBean.text}" id="text"/>
                <p:commandButton value="Disable InputText" action="#{disableTestBean.onDisable}" update="@form" />
                <p:commandButton value="Cancel" action="#{disableTestBean.onCancel}" update="@form" onsuccess="PF('dialog').hide()" />
            </h:form>
        </p:dialog>
        <button onclick="PF('dialog').show()">Open</button>
    </h:body>
</html>

要真正看到重置的发生,请从第二个onsuccess的{​​{1}}属性中移除-当前关闭对话框。

commandButton

该示例针对一种特定的输入组件。但是,如果需要处理多个组件,则可以轻松地使用循环以常规方式完成所需的操作。

作为演示,我不仅重置了以上支持bean中的禁用状态,还重置了输入组件的值(内容)。这向您展示了如何实际重置组件的完整状态(不仅是单个属性或值)。因此,解决方案是广泛且非常笼统的。

第二种直接方法

第二种方法是执行 @Kukeltje 在上面的评论中暗示的内容。在输入组件上使用@Data @Named @ViewScoped public class DisableTestBean implements Serializable { private String text; private Object prevState; private UIComponent findComponent(String where) { final FacesContext context = FacesContext.getCurrentInstance(); final UIViewRoot root = context.getViewRoot(); return (UIComponent) root.findComponent(where); } public void onDisable() { final InputText component = (InputText) findComponent(":form:text"); component.setDisabled(false); component.setValue(""); prevState = component.saveState(FacesContext.getCurrentInstance()); component.setValue("meh"); component.setDisabled(true); } public void onCancel() throws IOException { final InputText component = (InputText) findComponent(":form:text"); component.restoreState(FacesContext.getCurrentInstance(), prevState); } } 属性,并具有一个后备bean值,当您按disabled=时,该值会将其更改为false。这不是一般的方法,不会对其他所有方法起作用,但是它将在您的特定用例中完成工作。如果您只对禁用状态感兴趣,那么它甚至可能是首选的处理方式。如果您也想要一个例子,我可以扩展这个答案-请让我知道。