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" />
<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:
<h:form>
<h:selectOneRadio value="#{testeController.opcao}">
<a4j:support event="onchange" reRender="panel1" actionListener="#{testeController.mudar}"/>
<f:selectItem itemValue="1" itemLabel="Mostrar"/>
<f:selectItem itemValue="2" itemLabel="Esconder"/>
</h:selectOneRadio>
<a4j:outputPanel id="panel1">
<a4j:outputPanel id="panel2" rendered="#{testeController.mostrar}">
<h:outputText value="Ola"/>
</a4j:outputPanel>
</a4j:outputPanel>
</h:form>
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
raf4ever
Fevereiro 14, 2012, 12:35pm
#11
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" />
<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!