我不知道这是否是一个常见问题,但是这个奇怪的问题让我有些头疼...... 我有一种奇怪的行为,我的应用程序有很多对话框,当用户打开一个对话框时,该对话框应该显示默认内容。问题是我在显示对话框之前清除了所有 bean 的属性,但有时似乎表单未清除! 例如,这是存在此问题的对话框之一:
此图显示了我第一次打开对话框时的显示方式,所有字段均被清除,并选择了第二个单选按钮。如果我更改单选选项并在输入字段中输入内容,数据表会立即显示与搜索相应的数据。因此,如果我单击“Cancelar”(葡萄牙语中的“取消”),该对话框将像预期的那样关闭。
然后我再次打开此对话框:
这些字段存储用户制作的最后一个版本。我以为我没有清除 bean,但如果我只是按 F5(刷新),对话框就会像第一张图片中那样显示。我不知道为什么,但有些字段没有更新!!
我的对话框是使用此模板创建的:
<ui:component>
<hrgi:popup id="#{idPopup}" titulo="#{titulo}" renderizar="#{popup.visivel}"
bordaConteudo="#{bordaConteudo eq null?true:bordaConteudo}">
<f:facet name="cabecalho">
<ui:insert name="cabecalho"></ui:insert>
</f:facet>
<f:facet name="conteudo">
<h:panelGroup id="#{idPopup}Conteudo" layout="block" style="width:100%">
<p:focus/>
<ui:insert name="conteudo">Nenhum conteúdo definido!</ui:insert>
</h:panelGroup>
</f:facet>
<f:facet name="botoes">
<h:panelGroup style="width:100%">
<h:panelGrid id="#{idPopup}PainelMensagens" style="width:100%">
<p:messages/>
</h:panelGrid>
<ui:insert name="barraDeBotoes">
<h:panelGroup layout="block" style="width:100%">
<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
immediate="true" update="@form"
action="#{controladorPopup.fechar}"/>
<p:commandButton value="OK" styleClass="hrgi-botao-popup"
action="#{controladorPopup.submit}" update="@form alerta #{atualizar}">
<f:param name="REQUIRED" value="true"/>
</p:commandButton>
</h:panelGroup>
</ui:insert>
</h:panelGroup>
</f:facet>
</hrgi:popup>
</ui:component>
打印中显示的对话框是这样创建的:
<ui:composition template="../templates/popupSubmit.xhtml">
<ui:param name="titulo" value="#{cadastroMsg['popup.cadastro.listagem_empresa.titulo']}" />
<ui:param name="popup" value="#{modeloPopupBuscaEmpresa}" />
<ui:param name="controladorPopup" value="#{controladorPopupBuscaEmpresa}" />
<ui:define name="conteudo">
<h:panelGroup layout="block" styleClass="hrgi-div-form clearfix">
<hrgi:listagem listenerBusca="#{controladorListagemEmpresa}"
valorBusca="#{modeloListagemEmpresa.valorBusca}">
<f:facet name="filtrosAdicionais">
<h:panelGroup layout="block">
<h:outputText value="#{msgGerais['gerais.listagem.filtro']}"/>
<h:selectOneRadio value="#{modeloListagemEmpresa.tipoFiltro}" immediate="true">
<f:selectItem itemLabel="CNPJ" itemValue="0"/>
<f:selectItem itemLabel="Apelido" itemValue="1"/>
<f:ajax event="change" immediate="true"
render="tabelaListagem"
listener="#{controladorListagemEmpresa.atualizarTipoFiltro}"/>
</h:selectOneRadio>
</h:panelGroup>
</f:facet>
<f:facet name="tabela">
<h:panelGroup layout="block" style="height: 219px; width: 103%">
<p:dataTable value="#{modeloListagemEmpresa.itens}"
scrollable="true" height="194" var="empresa"
emptyMessage="#{msgGerais['gerais.sem_dados']}"
selectionMode="single" onRowUnselectUpdate="painelInformacoes"
selection="#{modeloListagemEmpresa.itemSelecionado}"
onRowSelectUpdate="painelInformacoes">
<p:column style="width:20%"
headerText="Documento">
<h:outputText value="#{empresa.cnpj}"/>
</p:column>
<p:column style="width:80%"
headerText="Apelido">
<h:outputText value="#{empresa.nomeEmpresa}"/>
</p:column>
</p:dataTable>
</h:panelGroup>
</f:facet>
<f:facet name="informacoes">
<ui:include src="../../outros/painelInformacoesBasicasEmpresa.xhtml">
<ui:param name="modeloPopup" value="#{modeloListagemEmpresa}"/>
<ui:param name="pessoaSelecionada" value="#{controladorListagemEmpresa.pessoaSelecionada}"/>
</ui:include>
</f:facet>
</hrgi:listagem>
<p:messages/>
</h:panelGroup>
</ui:define>
</ui:composition>
如果我更改“取消”按钮的模板代码,只需删除immediate=true即可正常工作:
<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
update="@form"
action="#{controladorPopup.fechar}"/>
但在其他对话框中我有必填字段并且需要验证... 有人能解释一下为什么会发生吗?
最佳答案
我已经用第一种方法解决了这个问题 here
所以我创建了一个方法取消:
public void cancelar(){
fechar();
//Limpa todos os campos do formulário
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, context
.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
context.renderResponse();
}
现在按钮取消的工作方式如下:
<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
update="@form" immediate="true" action="#{controladorPopup.cancelar}"/>
关于java - 用户第二次打开对话框时,JSF 2.0 字段不会被清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9470617/