Setar propriedade no Controller via ajax [RESOLVIDO]

3 respostas
Norivan

Pessoal boa tarde, tenho um campo selectOneMenu dinamico na minha view que era para setar a propriedade idContrato do meu controller via ajax ao ser selecionado um item.
Coloquei a propriedade do controller no atriubuto value do select e coloquei um reRender no evento onchage no entato a propriedade no controller está vindo null.

xhtml
<h:selectOneMenu id="selectContrato"
				value="#{registroOcorrenciaController.idContrato}"
				label="#{i18n['beneficiarioForm.contrato']}"
				required="#{param['runningAction'] eq 'saveOrUpdate' and registroOcorrenciaController.entity.tipoSolicitante eq 'C'}">
				<f:selectItems
					value="#{registroOcorrenciaController.selectListaContrato}" var="contrato" />

				<a4j:support event="onchange" reRender="selectContrato"
					action="#{registroOcorrenciaController.carregaDadosSolicitante()}"
					ajaxsingle="true">
					<f:setPropertyActionListener value="#{contrato}"
						target="#{registroOcorrenciaController.idContrato}" />
				</a4j:support>
			</h:selectOneMenu>
controller
public Integer getIdContrato() {
		return idContrato;
	}

	public void setIdContrato(Integer idContrato) {
		this.idContrato = idContrato;
	}

Quando debugo o setIdContrato vem com parametro sempre igual a nulo, imagino que eu tenha que usar o f:setPropertyActionListener para setar a propriedade no controller, mas como se trata de um select como eu pego o valor que foi selecionado?

3 Respostas

Flavio_Almeida

Amigão, vai uma super sugestão: dê uma olhada no manual, por exemplo, do Richfaces. Ele tem exemplo desse e outros problemas que podem aparecer.

Resolvendo, eu espero, seu problema: quando você ativa uma requisição ajax como single, ela só envia os dados do objeto que disparou essa requisição (parcial view processing). Se você quiser enviar outros dados, ou melhor, se você quer que outros dados peguem carona com essa “requisiçãozinha”, você precisa usar process=IdDoSeuComponente.

<a4j:support event="onchange" reRender="selectContrato"   
                    action="#{registroOcorrenciaController.carregaDadosSolicitante()}"   
                    ajaxsingle="true"
                    process="selectContrato">

Certinho? Não esqueça de dar uma lida no manual. Eu costumo dizer que ele é um mini-curso. :slight_smile:

Abraço

retificando: como você já está usando dentro do componente, ele implicitamente já está fazendo isso. Então, provavelmente seu problema é outro. Só que tenho que me desligar agora da Internet. Boa sorte.

Norivan

Opá, sobre ler o manual, já dei umas 10 lidas antes, mas sempre é bom reler. Apesar de que este caso é um pouco especifíco para o manual.

De qualquer forma valeu pela dica.

Procurei no forum tb e achei esse post com um problema parecido http://www.guj.com.br/java/230457-manangerbean-nao-esta-pegando-valor-de-hselectonemenu

No meu caso funciona sem ajax, com botão, mas com ajax nada de funcionar.

Norivan

Resolvido, pelo que um outro programador que já mexe nesse sistema a mais tempo me falou estava certo mas parece que tem um bug nas bibliotecas. Como não consegui setar o idContrato usei um rich:dataTable:

<rich:dataTable value="#{registroOcorrenciaController.selectListaContrato}" elements="5" width="100%" var="item">

Criado 22 de setembro de 2011
Ultima resposta 23 de set. de 2011
Respostas 3
Participantes 2