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个以上输入元素的公式编写器。
答案 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
。这不是一般的方法,不会对其他所有方法起作用,但是它将在您的特定用例中完成工作。如果您只对禁用状态感兴趣,那么它甚至可能是首选的处理方式。如果您也想要一个例子,我可以扩展这个答案-请让我知道。