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

Dúvida JSF 2.x

Olá a todos. Como faço para poder pegar o value de um SelectOneMenu e um item de um datatable para serrem enviados via ajax?

Meu selectOneMenu:

<p:selectOneMenu value="#{oficinaMB.codigo}">
       <f:selectItem itemValue="1" itemLabel="Oficina 1" />
       <f:selectItem itemValue="2" itemLabel="Oficina 2" />
       <f:selectItem itemValue="3" itemLabel="Oficina 3" />
</p:selectOneMenu>

Meu dataTable:

<p:dataTable id="tabelaServicos" var="os" style="width: 50%"
            value="#{oficinaServicoMB.listaOficinaServico}">
            <p:column headerText="Serviço" style="width:80%; ">
                <h:outputText value="#{os.servico.descricao}" />
            </p:column>
            <p:column headerText="Excluir" style="width:20%; text-align:center;">
                <p:commandLink>
                    <p:ajax listener="#{oficinaServicoMB.excluirServico}" 
                        update="tabelaServicos">
                    </p:ajax>
                    <h:graphicImage height="20" library="images" name="delete.jpg" />
                </p:commandLink>
            </p:column>
        </p:dataTable>

Explicando : eu tenho um combo com e oficinas e toda vez que eu mudo a oficina no combo, o datatable atualiza com os serviços que essa oficina tem cadastrado(não coloquei o código ajax no combo pra evitar escrever muito código). No datatable, tem um botão que tem um listener para o método excluirServico. Minha dúvida é: como posso passar via ajax o código da oficina (que está no selectOneMenu) e o código do serviço que está no dataTable?

4 respostas

Olá Thadeu

Tende adicionar um componente ajax no seu menu e faze-lo atualizar a sua tabela:

<p:selectOneMenu value="#{oficinaMB.codigo}">
       <f:selectItem itemValue="1" itemLabel="Oficina 1" />
       <f:selectItem itemValue="2" itemLabel="Oficina 2" />
       <f:selectItem itemValue="3" itemLabel="Oficina 3" />
     <p:ajax listener="#{oficinaServicoMB.consultar}" update="tabelaServicos" />
</p:selectOneMenu>
/>

No seu método consultar(), faça a consulta das oficinasServiços utilizando o código que vai estar setado pelo selectOneMenu: oficinaMB.codigo.

olá Luis. Na verdade isso eu ja to fazendo, já existe esse código. Como disse acima eu não coloquei ele para evitar escrever mais código. O problema é aqui:

<p:dataTable id="tabelaServicos" var="os"
    ...

<p:commandLink>
                    <p:ajax listener="#{oficinaServicoMB.excluirServico}" 
                        update="tabelaServicos">
                    </p:ajax>

Como eu faço pra quando eu clicar nesse botão eu enviar o value do selectOneMenu junto com o código do datatable?

Ah.. entendi rs

O primefaces tem um atributo que chama process, nele você diz quais objetos serão processados quando a requisição ajax for executado.

Tente colocar para processar o form ou o componente do seu menu, para isso você vai precisar colocar um id ou um formulário no seu html:

<p:selectOneMenu id="oficina-menu" value="#{oficinaMB.codigo}">
       <f:selectItem itemValue="1" itemLabel="Oficina 1" />
       <f:selectItem itemValue="2" itemLabel="Oficina 2" />
       <f:selectItem itemValue="3" itemLabel="Oficina 3" />
     <p:ajax listener="#{oficinaServicoMB.consultar}" update="tabelaServicos" />
</p:selectOneMenu>



<p:commandLink>
                    <p:ajax listener="#{oficinaServicoMB.excluirServico}" 
                        process="@this,oficina-menu" update="tabelaServicos">
                    </p:ajax>

O @this eh necessário para processar os campos do datatable também, se os dois componentes (menu e datatable) estiverem no mesmo formulário, você pode ate trocar para @form.

solução!

Consegui resolver com o <f:setPropertyActionListener

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