Passar objeto como parametro via p:ajax [RESOLVIDO]

Pessoal, tem como passar a variavel que o dataTable do primefaces usa como parametro em uma chamada ajax?
exemplo:

<p:dataTable value="#{contatoController.contatos}" var="contato">

no caso a variavel contato, tem como passar ela num evento change de alguma coluna da tabela?

vlw

crie um get/set no seu MB
e chame pelo <f:setPropertyActionListener target="#{seuMB.contato}" value="#{contato}"/>

fiz isso, mas o objeto nunca chega. meu codigo:

&lt;h:inputText value="#{contato.telefone}"&gt; &lt;p:ajax event="change" update="@form" listener="#{contatoController.update}"&gt; &lt;f:setPropertyActionListener target="#{contatoController.contato}" value="#{contato}" /&gt; &lt;/p:ajax&gt; &lt;/h:inputText&gt;

MB

[code]public void setContato(Contato contato) {
System.out.println(contato);
this.contato = contato;
}

public void update(AjaxBehaviorEvent abe) {
	System.out.println("update");
}[/code]

tenta ± assim:

[code]<p:dataTable var=“contatos” id=“dtContatos” value="#{contatoController.contatos}" style=“font-size:0.8em;”>

<p:column>

				                    <p:commandButton action="#{contatoController.teste}"	 >
						                 <f:setPropertyActionListener target="#{contatoController.contato}" 
						                 	value="#{contatos}" />
						            </p:commandButton> 

									
						</p:column>
						
						<p:column>													      
				                    <h:outputText value="#{contato.id}"  />  
				                </p:column>

</p:dataTable>
[/code]

supondo que contatos é uma lista de objetos
e contato é um objeto

rmaragno obrigado pela dica! mas preciso que o evento seja disparado no change do inputText. A ideia é fazer um dataTable 100% editável

pela quantidade de testes que fiz, acho que não será possivel, se alguem tiver alguma dica, estou disposto a tentar hehehe

[]'s

ai você tem que usar o row editor

<p:column> <f:facet name="header"> <h:outputText value="Opções" styleClass="itemTitulo9" /> </f:facet> <p:rowEditor /> </p:column>

lembrando que você vai ter que usar um output e um input em todas suas colunas
ex:


<p:column>
								<f:facet name="header">
						           <h:outputText value="TESTE" />
						        </f:facet>
								<p:cellEditor> 
									<f:facet name="output">  
					                    <h:outputText value="#{contatos.teste}" />
					                </f:facet>  
					                <f:facet name="input">  
					                    <p:inputText value="#{contatos.teste}"  />
					                </f:facet> 
								</p:cellEditor>				
							</p:column>

e se quiser gravar isso tudo no banco, coloca na declaração do datatable o evento:

rowEditListener="#{seuBean.salvarMudancasNoRowEdit}"

e criar o respectivo método para gravar

cara, esse rowEditor eh uma gambiarra tremenda, nao posso fazer desse jeito. preciso fazer algo que fica igual aos grid’s do sencha, zk, kendo, etc.

ta complicado a coisa aqui. hehehe

vlw as dicas

mais algumas???

tem que ser no próprio datatable?
não pode chamar um dialog e editar?

[quote=rmaragno]tem que ser no próprio datatable?
não pode chamar um dialog e editar?[/quote]

nao precisa ser exatamente o dataTable, mas ele eh o container certo para essas coisas. a ideia eh fazer o Grid totalmente editavel, onde o usuario alterou um campo ele vai e grava no banco de dados.
eu ate consigo fazer isso com a tag f:ajax em todo o dataTable, mas ela nao passa o objeto que corresponde a linha e sim o valor do inputText, isso eh ruim, prq no managed bean eu nao consigo identificar de quem eh a coluna. entendeu meu dilema?

[]'s

Consegui, utilizando a tag f:param. o problema que o valor que ela passa é o OLD e nao o NEW. vou brigar com isso agora.

segue o codigo:

&lt;p:dataTable value="#{contatoController.contatos}" var="contato" &gt;
			&lt;f:ajax listener="#{contatoController.update}" immediate="true"&gt;
			&lt;f:param name="contato" value="#{contato}" /&gt;
				&lt;p:column headerText="Nome"&gt;
					&lt;h:inputText value="#{contato.nome}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="E-mail"&gt;
					&lt;a:inputText value="#{contato.email}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="Telefone"&gt;
					&lt;a:inputText value="#{contato.telefone}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="Assunto"&gt;
					&lt;a:inputText value="#{contato.assunto}" /&gt;
				&lt;/p:column&gt;
			&lt;/f:ajax&gt;
		&lt;/p:dataTable&gt;

conseguiu mauricio?

rmaragno, to conseguindo.

estou tendo dificuldades para lançar evento quando o usuario troca de linha na table, fiz uma função em javascript/jquery que coloca enventos em todos os componentes da tabela, porem quando há duas tabelas na mesma tela da conflito entre as variaves javascript.

no mais eu resolvi criando um componente com composite components, ta ficando profissional o negocio hehehe

[]'s

Poxa, tem como postar o código ? Estou com esse problemas pois estou migrando da versão 2.2 do primefaces para 3.2.

Grato.

&lt;ui:component xmlns="http://www.w3.org/1999/xhtml"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:composite="http://java.sun.com/jsf/composite"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns:p="http://primefaces.org/ui"&gt;

	&lt;composite:interface componentType="dataTable"&gt;
		&lt;composite:attribute name="value" /&gt;
	&lt;/composite:interface&gt;

	&lt;composite:implementation&gt;
		&lt;p:dataTable value="#{cc.rows}" id="my_data_table"&gt;
			&lt;c:set target="#{component}" property="var" value="#{cc.attrs.var}" /&gt;
			&lt;c:set target="#{component}" property="rowIndexVar"
				value="#{cc.attrs.rowIndexVar}" /&gt;
			&lt;composite:insertFacet name="header" /&gt;
			&lt;p:column&gt;
				&lt;h:outputText value="#{cc.rows.rowIndex + 1}" /&gt;
				&lt;p:remoteCommand action="#{cc.save}"
					name="rc_#{cc.rows.rowIndex}_#{cc.attrs.id}" update="@form"/&gt;
			&lt;/p:column&gt;
			&lt;composite:insertChildren /&gt;
			&lt;p:column style="width: 100px !important;"&gt;
				&lt;p:commandButton title="Salvar" icon="ui-icon-disk"
					action="#{cc.save}" process="@this" update="@form" /&gt;
				&lt;p:commandButton title="Excluir" icon="ui-icon-trash"
					action="#{cc.delete}" process="@this" update="@form" /&gt;
			&lt;/p:column&gt;
			&lt;composite:insertFacet name="footer" /&gt;
		&lt;/p:dataTable&gt;
	&lt;/composite:implementation&gt;
&lt;/ui:component&gt;

[code]
@FacesComponent(value = “dataTable”)
public class DataTable extends UIInput implements NamingContainer, Serializable {
private ListDataModel rows;
private List wrapper;

public ListDataModel getRows() {
	if (rows == null) {
		rows = new ListDataModel((List) getValue());
		wrapper = (List) rows.getWrappedData();
	}
	return rows;
}

@Override
public String getFamily() {
	return "javax.faces.NamingContainer";
}

public void save() {
	System.out.println("Save: " + rows.getRowIndex() + " - "
			+ rows.getRowData());
	if(rows.getRowIndex() == rows.getRowCount() - 1){
		Class c = rows.getRowData().getClass();
		try {
			wrapper.add(c.newInstance());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

public void delete() {
	System.out.println("Delete: " + rows.getRowIndex() + " - "
			+ rows.getRowData());
}

}[/code]

usa normal, so muda a tag

[code]
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=“http://www.w3.org/1999/xhtml
xmlns:ui=“http://java.sun.com/jsf/facelets
xmlns:h=“http://java.sun.com/jsf/html
xmlns:f=“http://java.sun.com/jsf/core
xmlns:p=“http://primefaces.org/ui
xmlns:a=“http://java.sun.com/jsf/composite/taglib”>
<h:head>
<h:outputStylesheet library=“css” name=“composite.css” />
<h:outputScript library=“js” name=“helper.js” />
</h:head>
<h:body>
<h:form style=“font-size: 12px”>
<a:dataTable var=“row” value="#{contatoController.contatos}">
<p:column headerText=“Nome”>
<p:inputText id=“nome” value="#{row.nome}" />
</p:column>
<p:column headerText=“Telefone”>
<p:inputText value="#{row.telefone}" />
</p:column>
<p:column headerText=“Assunto”>
<p:inputText value="#{row.assunto}" />
</p:column>
<p:column headerText=“Ativo”>
<p:selectBooleanCheckbox value="#{row.ativo}" />
</p:column>
<p:column headerText=“E-mail”>
<p:inputText value="#{row.email}" />
</p:column>
</a:dataTable>
</h:form>
</h:body>
</html>[/code]

pra enviar a linha usando javascript, basta vc chamar o metodo assim:
rc_NUMERO_DA_LINHA_ID_DATA_TABELA, exemplo:

// envia a linha 0 da table com id mytable
rc_0_mytable();

Muito obrigado Mauricio! Vou testar na minha aplicação.