【问题标题】:JSF 2.0 Fields aren't cleared the second time user opens dialogJSF 2.0 字段在用户第二次打开对话框时不会被清除
【发布时间】:2012-03-17 06:09:15
【问题描述】:

不知道是不是通病,但是这个奇怪的问题让我有些头疼…… 我有一个奇怪的行为,我的应用程序有很多对话框,当用户打开一个对话框时,对话框应该显示默认内容。问题是我在显示对话框之前清除了所有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}"/>

但在其他对话框中,我有需要验证的字段... 有人可以解释一下为什么会这样吗?

【问题讨论】:

  • 您发布的 sn-p 不包含最有趣的部分 - 包含值的实际字段的定义。我猜他们隐藏在&lt;ui:insert&gt; 后面。我们在这里看到的基本上是弹出窗口和按钮的标记 - 一切都是静态的。
  • @GrzegorzOledzki,我添加了更多信息:)

标签: java jsf jsf-2 refresh field


【解决方案1】:

我已经用第一种方法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}"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多