第二次用户打开对话框时,JSF 2.0字段未被清除
问题描述:
我不知道这是否是一个常见问题,但是这个奇怪的问题让我头疼...... 我有一个奇怪的行为,我的应用程序有很多对话框,当用户打开对话框时,对话框应该显示默认内容。问题是我在显示对话框之前清除了所有bean的属性,但有时看起来表单没有被清除! 例如,这是有这个问题的一个对话框:第二次用户打开对话框时,JSF 2.0字段未被清除
此图片显示在对话框如何显示我第一次打开它,所有字段都会被清除,则选择第二无线电。如果我更改无线电选择并在输入字段中输入内容,则数据表会立即显示相应的数据并进行搜索。所以,如果我点击“取消”(取消葡萄牙语),这个对话框就会关闭,就像预期的那样。
然后我再次打开此对话框,:
字段保存所做的最后一版的用户。我以为我没有清理这个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>
在打印所示的对话框创建这样说:如果我改变“Cancelar”按钮的模板代码
<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>
,只是删除即时=真正它工作正常:
<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
update="@form"
action="#{controladorPopup.fechar}"/>
但在其他对话框我有字段th在需要和需要验证... 有人可以解释我为什么会发生?
答
我已经解决了这个问题与第一种方法here
所以我创建了一个方法cancelar:
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();
}
现在按钮cancelar以这种方式工作:
<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
update="@form" immediate="true" action="#{controladorPopup.cancelar}"/>
的片段您发布的内容不包含最有趣的部分 - 包含值的实际字段的定义。我猜他们隐藏在''后面。我们在这里可以看到的基本上是弹出和按钮的标记 - 一切都是静态的。 –
2012-02-27 20:04:18
@GrzegorzOledzki,我添加了更多信息:) – brevleq 2012-02-28 11:31:26