0

我的意图是在 BD 中插入记录后以丰富的方式向用户显示一条消息:popupPanel。

使用下面的代码,我可以做我想做的事,但是有一个问题。仅当我正确键入所有页面字段时才有效。如果其中一个字段没有通过验证,则在 h:messages 中显示验证消息,并且页面不会更改,即使我更改了字段的内容并再次单击按钮。

有什么问题?

  • <h:outputLabel value="Nome:" for="nome1" />
    <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>
    
    <h:outputLabel value="Logradouro:" for="logradouro" />
    <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>
    
    <h:outputLabel value="Bairro:" for="bairro" />
    <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />
    
    <h:outputLabel value="CEP:" for="cep" />
    <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
        <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
    </h:inputText>
    
    <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>
    
    <a4j:outputPanel id="outPnlOk" ajaxRendered="true">
    <rich:popupPanel id="pnlOk" modal="true" height="150">
            <h:graphicImage value="/images/info.jpg" />
            <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
            <h:commandButton value="OK" action="dizimista?faces-redirect=true"
                onclick="#{rich:component('pnlOk')}.hide(); return false;" >
                <a4j:ajax execute="formPnlOk" />
            </h:commandButton>
        </rich:popupPanel>
    </a4j:outputPanel>
    

  • 托管豆

    public void inserirDizimista(){
        try{
            defineDizimista("formNovoDizimista");
            dizimistaFacade.criar(dizimista);
            setTextoModal("Dizimista inserido com sucesso");
            System.out.println("Dizimista '" + dizimista.getNome1() + "' inserido com sucesso");
            dizimista = null;
        } catch (DAOException e) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null);
            JSFHelper.getFacesContext().addMessage("ATENÇÃO!", msg);
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void defineDizimista(String nomeForm){
        Map<String, String> dados = getDadosFormulario(nomeForm);
        dizimista.setNome1(dados.get("nome1"));
        dizimista.setLogradouro(dados.get("logradouro"));
        dizimista.setBairro(dados.get("bairro"));
        dizimista.setCep(Integer.parseInt(dados.get("cep")));
    }
    
    private Map<String, String> getDadosFormulario(String form){
        Map<String, String> dados = new HashMap<String, String>();
        dados.put("nome1", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "nome1"));
        dados.put("logradouro", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "logradouro"));
        dados.put("bairro", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "bairro"));
        dados.put("cep", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cep"));
        dados.put("cidade", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cidade"));
        return dados;
    }
    
4

1 回答 1

1

当您rich:popupPanel通过 AJAX 渲染 a 的内容时(从 渲染a4j:commandButton),最好选择使用它的show属性有条件地显示它,而不是调用 Javascript 代码(oncomplete)。

所以,我建议你只添加一个条件来显示popupPanel. 假设textoModal在初始化时为空,并且您的 bean 是一个请求范围,您可以使用如下内容:

<rich:popupPanel id="pnlOk" modal="true"
       show="#{dizimistaMB.textoModal != null}" ...>

您可能希望在支持 bean 中创建一个方法,这样public boolean isShowTextoModal()可以实现比简单地检查字段是否不为空更好的规则。

然后,您可以将按钮更改为:

<h:commandButton id="btnInserirDizimista" value="Inserir"
       render="pnlMessages outPnlOk"
       action="#{dizimistaMB.inserirDizimista}" />

...并ActionEvent从您的方法中删除参数inserirDizimista,使其成为操作方法而不是 actionListener

这应该会让你的事情顺利进行。

于 2012-08-04T03:16:17.893 回答