Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

JSF e Ajax

Olá pessoal! Reparem no código abaixo:

        <h:form id="formListagem">

            <h2>Autores</h2>
            <h:dataTable value="#{autorBean.autores}" var="autor" id="autores"
                border="1">

                <h:column>
                    <f:facet name="header">Nome</f:facet>
                    <h:outputText value="#{autor.nome}" />
                </h:column>

                <h:column>
                    <f:facet name="header">E-mail</f:facet>
                    <h:outputText value="#{autor.email}" />
                </h:column>

                <h:column>
                    <f:facet name="header">Ações</f:facet>
                    <h:commandButton value="X" action="#{autorBean.excluir(autor)}">
                        <f:ajax execute="@this" render="@form :formCadastro:mensagens" />
                    </h:commandButton>

                    <h:commandButton value="Editar">
                        <f:setPropertyActionListener value="#{autor}"
                            target="#{autorBean.autor}" />
                    </h:commandButton>
                </h:column>

            </h:dataTable>

        </h:form>

No botão para efetuar a exclusão do registro, somente consigo fazer o ajax funcionar passando @form, mas na minha opinião deveria funcionar passando apenas autores(id do datatable), uma vez que tanto o botão quanto o datatable estão no mesmo form. Alguém pode me explicar o porquê deste comportamento, por favor??

Abraços

3 respostas

Opa Jonas, boa tarde. Não ficou muito claro para mim a sua dúvida.

Mas deixa eu tentar ajudar. Onde você indica o @form, é o componente a ser renderizado com o resultado da requisição ajax. Se o componente estiver dentro do mesmo form, basta indicá-lo pelo id do componente.

Ao utilizar os : antes do id, você indica o caminho absoluto do objeto, fora do form. Eu não vi no código acima, o componente <h:messages id="messages" />.

Dá uma conferida no teu código, atente para a hierarquia dos componentes, deve ter passado algum detalhe despercebido.

Espero ter ajudado.

Abraço.

E aeee Iuri :) !!

Primeiro, muito obrigado pelo feedback imediato! Então cara, a hierarquia de componentes, de forma resumida é a seguinte:

<h:form id="formListagem">
    <h:dataTable value="#{autorBean.autores}" var="autor" id="autores"  border="1">
                <h:column>
                    <f:facet name="header">Ações</f:facet>
                    <h:commandButton value="X" action="#{autorBean.excluir(autor)}">
                        <f:ajax execute="@this" render="@form :formCadastro:mensagens" />
                    </h:commandButton>
                </h:column>

         </h:dataTable>
 </h:form>

Antes de começarmos a analisar a situação, por favor, ignore o segundo componente a ser renderizado(:formCadastro:mensagens). Com este, está tudo ok! O meu problema, é com aquele @form ali. Pois estou utilizando ele para atualizar a tabela após clicar no botão de exclusão. Mas na minha opinião, ele deveria funcionar como o código que segue:

     <f:ajax execute="@this" render="autores :formCadastro:mensagens" />

Pois como ambos estão no mesmo form, dataTable e o commandButton, acho que ele deveria funcionar com o código da linha acima. Mas ele não está se comportando assim e só atualiza a tabela se eu utilizar o @form, como no primeiro trecho. Será que poderia ser algum problema de escopo de componentes, ou algo do tipo, uma vez que o commandButton está dentro do dataTable??

solução!

Oi Jonas,

pelo que sei isso é um bug do JSF do Mojarra, deveria funcionar mas Mojarra nega! Como solução vc deve atualizar o form mesmo.

abs

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software