Поля JSF 2.0 не очищаются при втором открытии пользователем диалогового окна - PullRequest
0 голосов
/ 27 февраля 2012

Я не знаю, является ли это общей проблемой, но эта странная проблема вызывает у меня некоторую головную боль ... У меня странное поведение, у моего приложения много диалогов, и когда пользователь открывает один,диалог должен показывать содержимое по умолчанию.Проблема в том, что я очищаю все свойства bean-компонента перед показом диалога, но иногда кажется, что форма не очищена !!Например, это один из диалоговых окон, в которых возникает эта проблема:

how it should be Это изображение показывает, как диалоговое окно отображается при первом его открытии, все поля очищаются и выбирается второе радио.Если я изменю выбор радиостанции и введу что-то в поле ввода, таблица данных немедленно отображает данные в соответствии с поиском.Итак, если я нажимаю «Отмена» (отмена на португальском), это диалоговое окно закрывается, как и ожидалось.

Затем я снова открываю это диалоговое окно и:

how it is shown after oppened after cancel action В полях хранятся поляпоследнее издание, сделанное пользователем.Я думал, что не очищаю бин, но если я просто нажму 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>

если я изменю код шаблона кнопки «Cancelar», просто удалив немедленный = true, он отлично работает:

<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
                                     update="@form"
                                     action="#{controladorPopup.fechar}"/>

, но в других диалоговых окнах у меня есть поля, которые являются обязательными инужна проверка ... Может ли кто-нибудь объяснить мне, почему это происходит ??

1 Ответ

1 голос
/ 08 марта 2012

Я решил эту проблему с первым подходом здесь

Итак, я создал метод 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();
}

теперь кнопка отмены работает таким образом:

<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
    update="@form" immediate="true" action="#{controladorPopup.cancelar}"/>
...