JSF: Recuperando linha selecionada de DataTable

9 respostas
felipempantoja

Olá pessoal!

Estou com um pequeno problema, estou usando o Richfaces já que tem muito componente legal pronto, então tenho a seguinte sequência:

Seleciono uma linha do meu dataTable carregado;

Um modalPanel abre me solicitando a confirmação desta ação;

Vou até meu managedBean e recupero a linha selecionada (ERRO).

Isso pq meu escopo é request e não session então eu não consigo fazer duas requisições e manter o resultado da primeira em memória, eu achei duas soluções:

  1. Ao invés de usar modalPanel, uso um simples alert, que assim a única ação seria a chamada do mbean. Algo desse tipo:
    <a4j:commandButton onclick=“if(!confirm(‘Deseja realizar esta ação?’)){ return false; }” oncomplete=“Richfaces.showModalPanel(‘modal’)”/>

  2. Criar um campo hidden no form dentro do modalPanel, que antes de ser chamado, passaria pelo mbean e o campo hidden seria carregado com o id do registro selecionado no dataTable (1ª ação), e depois eu poderia manipular o objeto pelo seu id (2ª ação).

O problema da primeira opção é que o alert do navegador não é legal :smiley: e a segunda opção não é nada elegante, e muito trabalhosa pra um simples procedimento.

Alguém teria uma idéia mais elegante de como resolver este problema?

Abraços. :smiley:

9 Respostas

felipempantoja

Até funciona mas só consigo recuperar sempre a primeira linha do dataTable com o getRowData…

D

Vc ta usando o filterby do richfaces na tabela???

vinihds

coloca o codigo

felipempantoja

O código:

&lt;!--Tela.xhtml--&gt;
&lt;rich:panel&gt;
	&lt;f:facet name="header"&gt;Gerenciar documentos&lt;/f:facet&gt;
					
	&lt;h:form id="formGerenciarDocumentos"&gt;
					
		&lt;rich:dataTable id="dataTableDocumentos" 	value="#{gerenciarDocumentosController.listaDeContratosTI}" var="documento"&gt;
	                    			
                	&lt;rich:column&gt;
                   		&lt;f:facet name="header"&gt;Id&lt;/f:facet&gt;
                    		&lt;h:outputText value="#{documento.id}"/&gt;
                   	&lt;/rich:column&gt;
                	&lt;rich:column&gt;
                   		&lt;f:facet name="header"&gt;Responsável&lt;/f:facet&gt;
                    		&lt;h:outputText value="#{documento.usuario.login}"/&gt;
                   	&lt;/rich:column&gt;
                   	&lt;rich:column&gt;
	               		&lt;f:facet name="header"&gt;Ações&lt;/f:facet&gt;
	               		&lt;a4j:commandButton image="/_img/delete.png" onclick="Richfaces.showModalPanel('modalRemoverDocumento')"&gt;
		               		&lt;rich:toolTip value="Remover" followMouse="true"/&gt;
		               	&lt;/a4j:commandButton&gt;
		        &lt;/rich:column&gt;		    			

             	&lt;/rich:dataTable&gt;
	             	
	&lt;/h:form&gt;
&lt;/rich:panel&gt;
			
&lt;rich:modalPanel id="modalRemoverDocumento" label="Confirmação de remoção!" resizeable="false" moveable="false" height="100"&gt;
	&lt;f:facet name="controls"&gt;&lt;h:graphicImage value="/_img/close.png" style="cursor: pointer" onclick="Richfaces.hideModalPanel('modalRemoverDocumento')"/&gt;&lt;/f:facet&gt;
	&lt;f:facet name="header"&gt;Confirmação de remoção!&lt;/f:facet&gt;
	&lt;center&gt;
		&lt;h:form&gt;
			Deseja realmente remover o documento selecionado?<br/><br/>
			&lt;a4j:commandButton styleClass="btns" value="Sim" actionListener="#{gerenciarDocumentosController.doRemoverDocumento}"/&gt;
			&lt;a4j:commandButton styleClass="btns" value="Não" onclick="Richfaces.hideModalPanel('modalRemoverDocumento')"/&gt;
		&lt;/h:form&gt;
	&lt;/center&gt;
&lt;/rich:modalPanel&gt;
//MBean.java
public void doRemoverDocumento(ActionEvent evt)
{
	HtmlDataTable dataTableDocumentos = (HtmlDataTable)FacesContext.getCurrentInstance()
									.getViewRoot()
									.findComponent("formGerenciarDocumentos:dataTableDocumentos");

	Documento documento = (Documento) dataTableDocumentos.getRowData();
	//Ações...
}
awilaz

Alguém conseguiu resolver este problema??

brunocl14

qual é o problema em usar a função confirm() do javascript.? funciona perfeitamente sem afetar o request.

awilaz

Sim… mas eu não gostaria de utilizar o confirm do javaScript. Mas já resolvi o problema.

Fiz com o modalPanel.

http://www.guj.com.br/posts/list/112075.java#604692

felipempantoja

Opa, fala pessoal!

Eu tinha até esquecido desse post, mas aí vi uma resposta no email e vim conferir hehe…
Eu acabei deixando por conta do javascript mesmo, e em alguns casos, eu re-salvava o id do objeto a cada requisição, o que era um trabalho um tanto árduo…

Por coincidência esses dias eu resolvi dar uma otimizada e fui procurar saber como funcionava a tag saveState do tomahawk…
Cara, é espetacular, resolveu todos os meus problemas desse tipo, com ela, eu consigo manter o estado do objeto da primeira requisição até sair da tela, show de bola.

No caso desse exemplo que eu deixei aí, seria todo esse código e logo acima do dataTable eu colocaria:

<t:saveState value="#{gerenciarDocumentosController.listaDeContratosTI}"/>

pronto, consigo manipular essa lista como se meu escopo fosse session :smiley:

Abração.

rponte

Hoje em dia é realmente complicado e caro trabalhar com JSF sem qualquer componente ou framework de escopo conversacional. Entre os componentes de escopo de conversação mais conhecidos o t:saveState do Tomahawk é realmente o melhor.

Hoje temos vários componentes, para o Richfaces há o a4j:keepAlive, contudo eu ainda tenho preferência pelo Tomahawk.
Abraços

Criado 22 de outubro de 2008
Ultima resposta 9 de dez. de 2008
Respostas 9
Participantes 6