Problema Rendered dinâmico - valores ñ chegam no MB

Bom dia caros amigos,
estou com um problema que está me tirando o sono, tenho um selectOneRadio que dispara uma renderização dinâmica de outra parte do formulário. até aí tudo bem,
a renderização ocorre sem problemas, contudo os valores não chegam no MB, as partes correspondentes a parte dinâmica chegam “null”, será que alguém já passou por isso???

SelectOneRadio:

	<h:outputLabel value="Tipo Erosão:" styleClass="label" />
			<a4j:region>
				<h:selectOneRadio id="radio_tipo_ocorr" value="#{ocorrenciaMB.joe}"
					valueChangeListener="#{ocorrenciaMB.exibirTipoErosaoAjax}"
					styleClass="radioOption">
					<a4j:ajax event="valueChange" render="panel_dinamico" />
					<f:selectItems value="#{ocorrenciaMB.radioTipoErosao}" />
				</h:selectOneRadio>
			</a4j:region>
			<rich:message for="radio_tipo_ocorr" />

A parte dinâmica:



<a4j:outputPanel id="panel_dinamico">
				<a4j:outputPanel id="panel_rendered"
					rendered="#{ocorrenciaMB.tipoErosaoFlag}">
					<h:outputLabel value="Frequência: " styleClass="label" />
						&nbsp;
							<h:outputLabel value="Ocasional" styleClass="radioOption" />
					<h:inputText id="txt_ocasional"
						value="#{processoMB.ocorrenciaCorrente.qtdeOcasional}" size="4" />

					<h:outputLabel value="Frequente" styleClass="radioOption" />
					<h:inputText id="txt_frequente"
						value="#{processoMB.ocorrenciaCorrente.qtdeFrequente}" size="4" />

					<h:outputLabel value="Muito Frequente" styleClass="radioOption" />
					<h:inputText id="txt_muito_frequente"
						value="#{processoMB.ocorrenciaCorrente.qtdeMuitoFrequente}"
						size="4" />
				</a4j:outputPanel>
			</a4j:outputPanel>

Agradeço a colaboração!!!

Será que alguém teria ao menos um exemplo de código que faça algo semelhante ao que eu queira?

Eu diria que o problema está nesse a4j:region.

Quando vc coloca um region,basicamente vc está dizendo:Processe apenas esse trecho da página no servidor.

[quote=raf4ever]Eu diria que o problema está nesse a4j:region.

Quando vc coloca um region,basicamente vc está dizendo:Processe apenas esse trecho da página no servidor.[/quote]

Fiz dois testes o primeiro foi retirar a tag <a4j:region>, e o segundo foi envolver toda as partes com a tag em questão, contudo
o problema persiste, percebi que se retiro esse rendered do <a4j:outputPanel> funciona corretamente entretanto a parte do formulário ficará estática.

Será que existe algum outro modo de fazer isso?

Esta página está dentro de um <rich:togglePanel switchType=“ajax”> tem alguma relação?

Obrigado!

[quote=Sinvaldo_Junior][quote=raf4ever]Eu diria que o problema está nesse a4j:region.

Quando vc coloca um region,basicamente vc está dizendo:Processe apenas esse trecho da página no servidor.[/quote]

Fiz dois testes o primeiro foi retirar a tag <a4j:region>, e o segundo foi envolver toda as partes com a tag em questão, contudo
o problema persiste, percebi que se retiro esse rendered do <a4j:outputPanel> funciona corretamente entretanto a parte do formulário ficará estática.

Será que existe algum outro modo de fazer isso?

Esta página está dentro de um <rich:togglePanel switchType=“ajax”> tem alguma relação?

Obrigado![/quote]

Nunca usei esse rich:toggle e minhas aplicações sempre funcionaram usando Ajax,portanto eu tiraria ele.

E tbm setaria esse a4j:outputPanel para ajaxRendered=“true”

retirei a página do rich:togglePanelItem e coloquei o ajaxRendered=“true” nos dois outputPanels, porém ainda não obtive sucesso,
será que teria mais alguma coisa que eu poderia tentar? estou achando que isso é insolúvel já rs

Eu acho que vc não precisa ter dois a4j:outputPanel,vc só precisaria fazer assim se o teu outputPanel mais interno estivesse com renderização condicional,o que não é o caso.

EDIT:Falei besteira,só vi depois que tem um rendered="#{ocorrenciaMB.tipoErosaoFlag}"

Como eh q tá sendo montada essa lista <f:selectItems value="#{ocorrenciaMB.radioTipoErosao}" /> ?

Exemplo basico que eu fiz aqui:
Página:

 &lt;h:form&gt;
	 
	      &lt;h:selectOneRadio value="#{testeController.opcao}"&gt;
	          &lt;a4j:support event="onchange" reRender="panel1" actionListener="#{testeController.mudar}"/&gt;
	         &lt;f:selectItem itemValue="1" itemLabel="Mostrar"/&gt;
	         &lt;f:selectItem itemValue="2" itemLabel="Esconder"/&gt;
	      &lt;/h:selectOneRadio&gt;
	 
	    &lt;a4j:outputPanel id="panel1"&gt;
	       &lt;a4j:outputPanel id="panel2" rendered="#{testeController.mostrar}"&gt;
	          &lt;h:outputText value="Ola"/&gt;
	          &lt;/a4j:outputPanel&gt;
	      &lt;/a4j:outputPanel&gt;
	  &lt;/h:form&gt;

MB:

public class TesteController {

	String opcao;
	boolean mostrar;



	public boolean isMostrar() {
		return mostrar;
	}

	public void setMostrar(boolean mostrar) {
		this.mostrar = mostrar;
	}

	public String getOpcao() {
		return opcao;
	}

	public void setOpcao(String opcao) {
		this.opcao = opcao;
	}

	public TesteController(){
		setOpcao("1");
		setMostrar(true);
	}

	public void mudar(ActionEvent evt){
        if(opcao.equals("1")) {
        	mostrar = true;
        }else{
        	mostrar = false;
        }
	}

Beleza, primeiramente muito obrigado pela sua ajuda cara! agora deu certo

mesmo assim irei postar aqui como estava o meu MB para contribuir com alguém que por acaso passe pela mesma
situação,


/**
 * 
 * @author sinvaldo
 * 
 */
@ManagedBean(name = "ocorrenciaMB")
public class OcorrenciaMB {

	@EJB
	private TesteEJBRemote test;

	// private FacesContext context = FacesContext.getCurrentInstance();

	private String opcaoTipoErosao;

	private boolean tipoErosaoFlag = false;

	private List<SelectItem> radioTipoErosao;

	public OcorrenciaMB() {
		if (this.radioTipoErosao == null) {
			radioTipoErosao = new ArrayList<SelectItem>();
			radioTipoErosao.add(new SelectItem('S', "Sulco"));
			radioTipoErosao.add(new SelectItem('L', "Laminar"));
		}
	}

	public void exibirTipoErosaoAjax(ValueChangeEvent evt) {

		if ("S".equals(String.valueOf(evt.getNewValue()))) {
			this.tipoErosaoFlag = true;
		} else {
			this.tipoErosaoFlag = false;
		}
	}

	// COMBO BOX
	private TreeMap<String, TipoErosao> tiposErosao;

	public List<SelectItem> getRadioTipoErosao() {
		return radioTipoErosao;
	}

	public void setRadioTipoErosao(List<SelectItem> radioTipoErosao) {
		this.radioTipoErosao = radioTipoErosao;
	}

	public TreeMap<String, TipoErosao> getTiposErosao() {
		if (this.tiposErosao == null) {
			this.tiposErosao = new TreeMap<String, TipoErosao>();
		}
		List<TipoErosao> tpErosao = test.listarTipoErosao();

		for (TipoErosao tipoErosao : tpErosao) {
			this.tiposErosao.put(tipoErosao.getNomeErosao(), tipoErosao);
		}
		return tiposErosao;
	}

	public String getOpcaoTipoErosao() {
		return opcaoTipoErosao;
	}

	public void setOpcaoTipoErosao(String opcaoTipoErosao) {
		this.opcaoTipoErosao = opcaoTipoErosao;
	}

	public boolean isTipoErosaoFlag() {
		return tipoErosaoFlag;
	}

	public void setTipoErosaoFlag(boolean tipoErosaoFlag) {
		this.tipoErosaoFlag = tipoErosaoFlag;
	}

	public void setTiposErosao(TreeMap<String, TipoErosao> tipoOcorrencias) {
		this.tiposErosao = tipoOcorrencias;
	}

}

Versão corrigida:

/**
 * 
 * @author sinvaldo
 * 
 */
@ManagedBean(name = "ocorrenciaMB")
public class OcorrenciaMB {

	@EJB
	private TesteEJBRemote test;

	@Inject
	ProcessoMB processoMB;
	private FacesContext context = FacesContext.getCurrentInstance();

	// private String contentPath = context.getExternalContext()
	// .getRequestContextPath();

	// private boolean camposErosaoLaminar = false;
	//
	// private boolean camposErosaoSulco = false;

	private String opcaoTipoErosao;

	private boolean tipoErosaoFlag = false;

	private boolean coordFlag = false;

	private List<SelectItem> radioTipoErosao;

	// COMBO BOX
	private TreeMap<String, TipoErosao> tiposErosao;

	// *****CONSTRUTOR*****
	public OcorrenciaMB() {
		this.setOpcaoTipoErosao("1");
		this.setTipoErosaoFlag(true);

	}

	public void exibirTipoErosaoAjax(ValueChangeEvent evt) {

		this.coordFlag = true;

		if ("1".equals(String.valueOf(evt.getNewValue()))) {
			this.tipoErosaoFlag = true;
		} else {
			this.tipoErosaoFlag = false;
		}
	}

	public ProcessoMB getProcessoMB() {
		return processoMB;
	}

	public void setProcessoMB(ProcessoMB processoMB) {
		this.processoMB = processoMB;
	}

	public boolean isCoordFlag() {
		return coordFlag;
	}

	public void setCoordFlag(boolean coordFlag) {
		this.coordFlag = coordFlag;
	}

	public List<SelectItem> getRadioTipoErosao() {
		return radioTipoErosao;
	}

	public void setRadioTipoErosao(List<SelectItem> radioTipoErosao) {
		this.radioTipoErosao = radioTipoErosao;
	}

	public TreeMap<String, TipoErosao> getTiposErosao() {
		if (this.tiposErosao == null) {
			this.tiposErosao = new TreeMap<String, TipoErosao>();
		}
		List<TipoErosao> tpErosao = test.listarTipoErosao();

		for (TipoErosao tipoErosao : tpErosao) {
			this.tiposErosao.put(tipoErosao.getNomeErosao(), tipoErosao);
		}
		return tiposErosao;
	}

	public String getOpcaoTipoErosao() {
		return opcaoTipoErosao;
	}

	public void setOpcaoTipoErosao(String opcaoTipoErosao) {
		this.opcaoTipoErosao = opcaoTipoErosao;
	}

	public boolean isTipoErosaoFlag() {
		return tipoErosaoFlag;
	}

	public void setTipoErosaoFlag(boolean tipoErosaoFlag) {
		this.tipoErosaoFlag = tipoErosaoFlag;
	}

	public void setTiposErosao(TreeMap<String, TipoErosao> tipoOcorrencias) {
		this.tiposErosao = tipoOcorrencias;
	}

}

por favor me corrija caso esteja enganado, mas pelo o que entendi a primeira versão não funcionou porque os campos iniciavam ocultos
e por conta disto algum possível JavaScript Engine não conseguia realizar a leitura desses campos, certo?

ou será que tem relação com o modo com que estava montando o meu SelectOneRadio ?

Muito obrigado pela ajuda amigo!!
Abraços

por favor me corrija caso esteja enganado, mas pelo o que entendi a primeira versão não funcionou porque os campos iniciavam ocultos
e por conta disto algum possível JavaScript Engine não conseguia realizar a leitura desses campos, certo? 

Creio que não seja isso,eu mudei aqui no meu exemplo pra iniciar oculto e mesmo assim consegui realizar o ajax direitinho.

Como foi q ficou a versão final da página?

vamos lá.

SelectOneRadio


<h:selectOneRadio id="radio_tipo_ocorr" value="#{ocorrenciaMB.opcaoTipoErosao}"
					valueChangeListener="#{ocorrenciaMB.exibirTipoErosaoAjax}"
					styleClass="radioOption">
					<f:selectItem itemValue="1" itemLabel="Sulco" />
					<f:selectItem itemValue="2" itemLabel="Laminar" />
					<a4j:ajax event="valueChange" render="panel_dinamico"/>
			</h:selectOneRadio>
			<rich:message for="radio_tipo_ocorr" />

OutputPanel com renderização dinâmica:


<a4j:outputPanel id="panel_dinamico" layout="block" ajaxRendered="true">
				<a4j:outputPanel id="panel_rendered"
					rendered="#{ocorrenciaMB.tipoErosaoFlag}" layout="block">
					<h:outputLabel value="Frequência: " styleClass="label" />
						&nbsp;
					<h:outputLabel value="Ocasional" styleClass="radioOption" />
					<h:inputText id="txt_ocasional" label="ocasional_label" 
						value="#{processoMB.ocorrenciaCorrente.qtdeOcasional}" size="4" />

					<h:outputLabel value="Frequente" styleClass="radioOption" />
					<h:inputText id="txt_frequente" label="frequente_label"
						value="#{processoMB.ocorrenciaCorrente.qtdeFrequente}" size="4" />

					<h:outputLabel value="Muito Frequente" styleClass="radioOption" />
					<h:inputText id="txt_muito_frequente" label="m_frequente_label"
						value="#{processoMB.ocorrenciaCorrente.qtdeMuitoFrequente}"
						size="4" />
				</a4j:outputPanel>
			</a4j:outputPanel>

MB:


package br.com.solo.managedbean;

import java.util.List;
import java.util.TreeMap;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import br.com.solo.ejb.TesteEJBRemote;
import br.com.solo.model.TipoErosao;

/**
 * 
 * @author sinvaldo
 * 
 */
@ManagedBean(name = "ocorrenciaMB")
public class OcorrenciaMB {

	@EJB
	private TesteEJBRemote test;

	private String opcaoTipoErosao;

	private boolean tipoErosaoFlag = false;

	private List<SelectItem> radioTipoErosao;

	// COMBO BOX
	private TreeMap<String, TipoErosao> tiposErosao;

	// *****CONSTRUTOR*****
	public OcorrenciaMB() {
		this.setOpcaoTipoErosao("1");
		this.setTipoErosaoFlag(true);

	}

	public void exibirTipoErosaoAjax(ValueChangeEvent evt) {

		if ("1".equals(String.valueOf(evt.getNewValue()))) {
			this.tipoErosaoFlag = true;
		} else {
			this.tipoErosaoFlag = false;
		}
	}

	public List<SelectItem> getRadioTipoErosao() {
		return radioTipoErosao;
	}

	public void setRadioTipoErosao(List<SelectItem> radioTipoErosao) {
		this.radioTipoErosao = radioTipoErosao;
	}

	public TreeMap<String, TipoErosao> getTiposErosao() {
		if (this.tiposErosao == null) {
			this.tiposErosao = new TreeMap<String, TipoErosao>();
		}
		List<TipoErosao> tpErosao = test.listarTipoErosao();

		for (TipoErosao tipoErosao : tpErosao) {
			this.tiposErosao.put(tipoErosao.getNomeErosao(), tipoErosao);
		}
		return tiposErosao;
	}

	public String getOpcaoTipoErosao() {
		return opcaoTipoErosao;
	}

	public void setOpcaoTipoErosao(String opcaoTipoErosao) {
		this.opcaoTipoErosao = opcaoTipoErosao;
	}

	public boolean isTipoErosaoFlag() {
		return tipoErosaoFlag;
	}

	public void setTipoErosaoFlag(boolean tipoErosaoFlag) {
		this.tipoErosaoFlag = tipoErosaoFlag;
	}

	public void setTiposErosao(TreeMap<String, TipoErosao> tipoOcorrencias) {
		this.tiposErosao = tipoOcorrencias;
	}

}

E assim funcionou que é uma beleza!