Primefaces 3 (DataTable - Lazy Loading)

12 respostas
B

Prezados,

Alguém pode me ajudar com o componente DataTable - Lazy Loading do primefaces. Na verdade nem sei se este componente funciona corretamente. Verifiquei vários posts no fórum do primefaces e muitos sem solução.

Enfim, meu problema é: ao selecionar uma linha da tabela, preciso atualizar via ajax 3 campos inputTex. Segui o exemplo disponível em http://www.primefaces.org/showcase/ui/datatableLazy.jsf mas ainda não consegui fazer funcionar e já estou tentando a alguns dias.

Caso alguém possua um exemplo funcional, poderia postar aqui ou me enviar via MP?

Muito obrigado;)

12 Respostas

D

Cara, o teu problema é com o LazyLoading/LazyDataModel ou com o RowSelect?

Se o teu problema for SOMENTE na hora de selecionar um registro e atualizar os 3 inputText tenta o seguinte:

<p:dataTable id="tabela" var="item" value="#{seuController.findAll()}" rowKey="#{item.id}"  
                                 selectionMode="single" paginator="true" paginatorPosition="top" 
                                 >  

                        <p:ajax event="rowSelect" listener="#{SeuController.onRowSelect}"  update="inputId1 inputId2 inputId3"/>
</p:dataTable>

Entendeu? Usa o evento rowSelect do p:ajax.

B

diegosammet:
Cara, o teu problema é com o LazyLoading/LazyDataModel ou com o RowSelect?

Se o teu problema for SOMENTE na hora de selecionar um registro e atualizar os 3 inputText tenta o seguinte:

<p:dataTable id="tabela" var="item" value="#{seuController.findAll()}" rowKey="#{item.id}"  
                                 selectionMode="single" paginator="true" paginatorPosition="top" 
                                 >  

                       <p:ajax event="rowSelect" listener="#{fiscalEnvolvidoBean.onRowSelect}"update=":frm_cadastro_fiscal_envolvido:panel_fiscal_envolvido" />
</p:dataTable>

Entendeu? Usa o evento rowSelect do p:ajax.

Olá Diego!

Meu problema é somente com o rowSelect. Já havia feito da forma que vc falou…mas não atualiza de forma alguma. Veja:

<p:fieldset legend="#{msg.aie_legenda_filtro}">
				<p:dataTable id="tabela_fiscais_aba_efetivo" var="fiscal"
					value="#{fiscalEnvolvidoBean.lazyModel}" paginator="true"
					rows="5"
					paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
					rowsPerPageTemplate="5,10,15" 
					rowKey="#{fiscal.fiscalPK.matricula}" selectionMode="single" selection="#{fiscalEnvolvidoBean.fiscalSelecionado}">
								
                    <p:ajax event="rowSelect" update=":frm_cadastro_fiscal_envolvido:panel_fiscal_envolvido" />
														
					<p:column headerText="#{msg.fiscal_envolvido_coluna_nome}" filterBy="#{fiscal.pessoaFisica.pessoa.nome}">
						<h:outputText value="#{fiscal.pessoaFisica.pessoa.nome}" />
					</p:column>

...
...
D

Bom, primeiro tenta colocar a chamada pro seu MB no listener do p:ajax, dessa forma: listener="#{SeuController.onRowSelect}"

Dessa forma você irá criar um método que recebe um SelectEvent:

public void onRowSelect(SelectEvent slc) {
        seuObjeto = (SuaClasse) slc.getObject();
}

Se dessa forma não funcionar, tenta checar o código fonte da sua página, verifique se os Ids dos componentes que você quer atualizar são esses mesmos…

fabiozanardi

se der certo posta ai, pq ainda não consegui implementar um lazyloading com primefaces :S

B

Diego,

Conforme indicado implementei no MB o método onRowSelect (conforme abaixo) e habilitei um breakpoint, mas este método não é chamado :shock:

public void onRowSelect(SelectEvent event) {  
        FacesMessage msg = new FacesMessage("Fiscal selecionado: " + this.fiscalSelecionado.toString());  
  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
        this.setFiscalSelecionado((Fiscal) event.getObject());  
    }

Quanto aos id do componente que quero atualizar, está correto. Pelo console do firebug fiz um teste simples para ter certeza que o id está correto e funcionou:

$('#panel_fiscal_envolvido').hide();

Alguma outra sugestão?

D

fabiozanardi

O problema dele não é o LazyLoading, é o RowSelect.
Se você não tiver conseguindo utilizar o LazyLoading, ou seja, carregar as informações na tabela de forma Lazy, cria um tópico especifico pra isso, postando o seu código. Ou me manda um mp com o código.

D

Bom, verifica se chama o método:

selection="#{fiscalEnvolvidoBean.fiscalSelecionado}"

Se o fiscalSelecionado por setado corretamente o problema é somente na atualização do painel, correto? Se for somente esse o problema, é porque o PrimeFaces tem uma grande dificuldade em atualizar p:panel (Leia, não funciona 99% das vezes); Então ao invez de atualizar o panel, tenta atualizar o FORM, ou atualizar os inputTexts.

Mas primeiro verifica se o método está sendo chamado corretamente.

B

diegosammet:
Bom, verifica se chama o método:

selection="#{fiscalEnvolvidoBean.fiscalSelecionado}"

Se o fiscalSelecionado por setado corretamente o problema é somente na atualização do painel, correto? Se for somente esse o problema, é porque o PrimeFaces tem uma grande dificuldade em atualizar p:panel (Leia, não funciona 99% das vezes); Então ao invez de atualizar o panel, tenta atualizar o FORM, ou atualizar os inputTexts.

Mas primeiro verifica se o método está sendo chamado corretamente.

Diego, o método setFiscalSelecionado não está sendo chamado… Ainda não sei o porquê, mas estou analisando…

B

Galera,

Ainda estou na luta… quase desistindo deste componente… Caso alguém tenha mais alguma sugestão, será muito bem vinda.

Obrigado :wink:

B

blastec:
Galera,

Ainda estou na luta… quase desistindo deste componente… Caso alguém tenha mais alguma sugestão, será muito bem vinda.

Obrigado ;)

Alguém? :lol:

Jr_webmaster_100_jav

se nao resolveu ainda, tenta assim…
eu uso assim aqui
cria um metodo na sua classe

public void selecionar(SelectEvent event)
	{
		this.clienteEdit = (Cliente)event.getObject();
	}

e no seu p:ajax coloca o seguinte

<p:ajax listener="#{clienteDAO.selecionar}" event="rowSelect" update="MainForm"/>

comigo funciona.

caso tenha resolvido de outra maneira e queira compartilhar com galera… seria muito legal.

Espero ter ajudado.

G

Sei que o tópico foi aberto faz um bom tempo…
Pra resolver este problema adicione os atributos process e immediate conforme exemplo abaixo

<p:ajax process="@this" immediate="true" event="rowSelect" listener="#{fiscalEnvolvidoBean.onRowSelect}"update=":frm_cadastro_fiscal_envolvido:panel_fiscal_envolvido" />

[]'s

Criado 27 de fevereiro de 2012
Ultima resposta 8 de jun. de 2012
Respostas 12
Participantes 5