Quando eu disparo a action listener eu consigo carregar o campo de cidades.
Porém os outros campos do formulário perdem seus valores.
Achei uma solução: colocar o atributo “process=’@form’” no p:ajax.
Dessa forma não perco os valores. Porém ele processa o formulário inteiro e todas as validações.
Todas as validações(como de campo obrigatório) são realizadas e eu não queria nesse momento.
Só quando o usuário clicasse em gravar.
Tente colocar immediate=“true” para o componente ajax, se não der, tente colocar no componente selectOneMenu
R
resende_net
Coloquei o immediate=“true”, porém continua a mesma coisa.
Ao executar a action, os campos que estão com required=“true” são processados.
E mensagens de altera ao usuário são mostradas!
Já tô ficando doido com este problema!
R
resende_net
Alguém?
F
fabiocesar.ti
Cara, qual o scopo do teu managedbean?
E
ErickRAR
Precisa atualizar o form todo mesmo? Pq não atualiza só o componente com o campo de Cidades?
F
fabiocesar.ti
Cara, coloca teu managedBean ai pra ver como está implementado.
R
resende_net
@ManagedBean@ViewScopedpublicclassCadastroBeanimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringendereco;privateEstadoestado;privateCidadecidade;privateList<Cidade>cidades;publicvoidactionEstado(){if(getEstado()!=null){carregarCidades();}else{setCidade(null);setCidades(null);}}privatevoidcarregarCidades(){setCidades(newArrayList<Cidade>());for(Cidadecidade:Cidade.values()){if(cidade.getEstado().equals(getEstado())){getCidades().add(cidade);}}}publicvoidgravar(){FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_INFO,"Info","Dados gravados com sucesso"));System.out.println("Endereço: "+getEndereco());System.out.println("Estado: "+getEstado());System.out.println("Cidade: "+getCidade());}publicEstado[]getEstados(){returnEstado.values();}publicEstadogetEstado(){returnestado;}publicvoidsetEstado(Estadoestado){this.estado=estado;}publicCidadegetCidade(){returncidade;}publicvoidsetCidade(Cidadecidade){this.cidade=cidade;}publicList<Cidade>getCidades(){returncidades;}publicvoidsetCidades(List<Cidade>cidades){this.cidades=cidades;}publicStringgetEndereco(){returnendereco;}publicvoidsetEndereco(Stringendereco){this.endereco=endereco;}}publicenumEstado{DF,GO,SP,RJ,MG}publicenumCidade{BRASILIA(Estado.DF,"Brasília"),TAGUATINGA(Estado.DF,"Taguatinga"),CEILANDIA(Estado.DF,"Ceilândia"),AGUAS_CLARAS(Estado.DF,"Águas Claras"),RIO_DE_JANEIRO(Estado.RJ,"Rio de Janeiro"),RIO_DAS_OUTRAS(Estado.RJ,"Rio das Ostras"),ANGRA_DOS_REIS(Estado.RJ,"Angra dos Reis"),SAO_PAULO(Estado.SP,"São Paulo"),CAMPINAS(Estado.SP,"Campinas"),SANTOS(Estado.SP,"Santos"),GOIANIA(Estado.GO,"Goiânia"),ANAPOLIS(Estado.GO,"Anápolis"),URUACU(Estado.GO,"Uruaçu"),PATOS_DE_MINAS(Estado.MG,"Patos de Minas"),BELO_HORIZONTE(Estado.MG,"Belo Horizonte"),OURO_PRETO(Estado.MG,"Ouro Preto"),UBERLANDIA(Estado.MG,"Uberlândia");privateEstadoestado;privateStringdescricao;Cidade(Estadoestado,Stringdescricao){this.estado=estado;this.descricao=descricao;}publicEstadogetEstado(){returnthis.estado;}publicStringgetDescricao(){returnthis.descricao;}}
Tente com @SessionScoped e faça o que eu falei ali em cima.
R
resende_net
ErickRAR na funcionalidade que estou trabalhando não é interessante trabalhar com SessionScoped.
O usuário não pode salvar o estado no servidor por mais de uma página.
Mas mesmo assim não funcionou corretamente.
Atualizando apenas os campos que quero que sejam renderizados, eles não são renderizados corretamente.
É o mesmo código que eu utilizo para atualizar uma div ao invés de um selectOneMenu, com o mesmo escopo inclusive. Não deve mudar em nada.
R
resende_net
Esqueci de retornar ao fórum e dar meu feedback.
Consegui resolver há um tempo atrás.
Tudo foi simplificado ao processar somente o próprio componente, ou os componentes dependentes.
Troquei o valor do atributo process da tag p:ajax para o valor “@this”:
<p:ajax process="@this" update=“selectCidade”/>
Eu não preciso processar todo o form.
Cada valor que for processado será validado. Então o correto não é processar todo o form, só dos campos que preciso que sejam atualizados no meu bean no momento da requisição ajax.
Após essa mudança, a quantidade de informaçoes diminui muito e tudo ficou muito mais rápido.
Obrigado galera pela força!
Deu tudo certo.
P
port8500dwl
[email removido:
]Não resolveu.
Retomei ao problema que estava tendo.
Até hoje não consegui resolver.
Primeiro cria essa classe:
public class ComponenteJSFPrimeFacesUtilConverter {
REQUEST > Aplicar valores do Request > Processar Eventos > Processa Validações > Processa Eventos de mudança de valor > Atualiza Valores do modelo > Processa eventos de ação > Invocar Aplicação > Processa Eventos > Renderiza resposta > RESPONSE.
Uma saída que encontrei foi interromper o ciclo, após o processamento do meu evento, já renderizando os componentes em página sem dar continuidade no ciclo(o que evita a validação do campo). Ficaria +/- assim:
public void actionEstado() {
if (getEstado() != null) {
carregarCidades();
FacesContext.getCurrentInstance().renderResponse();
} else {
setCidade(null);
setCidades(null);
FacesContext.getCurrentInstance().renderResponse();
}
}