JSF : selectOneMenu em cascata

6 respostas
dfalci

Pessoal… estou com o seguinte problema :
Devo fazer com que 5 selectOneMenu estejam interligados em cascata. Ex: tenho um com o país… ao ser selecionado um país, no segundo combo mostro os estados disponíveis para aquele país… no terceiro, dependendo do filtro do estado, mostro as cidades… e assim sucessivamente.

Eis que o meu managed-bean está com escopo de requisição e os selectOneMenu estão todos configurados para acessarem o um valueChangeListener que eu configurei no meu bean… ex:

<h:selectOneMenu id="selectCategoriaEmpresa" value="#{dialogoBean.pojo.empresa.categoria.id}" style="width: 305px" onchange="submit()" valueChangeListener="#{dialogoBean.selecionarCategoriaEmpresa}" >
	<f:selectItems value="#{dialogoBean.categoriaItemHelper.itens}" />
	</h:selectOneMenu>
	<h:selectOneMenu id="selectEmpresa" value="#{dialogoBean.pojo.empresa.id}" style="width: 305px" rendered="#{dialogoBean.mostraListaEmpresa}" onchange="submit()" valueChangeListener="#{dialogoBean.selecionarEmpresa}" >
	<f:selectItems value="#{dialogoBean.empresaItemHelper.itens}" />
	</h:selectOneMenu>
	<h:selectOneMenu id="selectUnidade" value="#{dialogoBean.pojo.unidade.id}" style="width:305px;" rendered="#{dialogoBean.mostraListaUnidade}" onchange="submit()" valueChangeListener="#{dialogoBean.selecionarUnidade}" >
	<f:selectItems value="#{dialogoBean.unidadeItemHelper.itens}" />
	</h:selectOneMenu>

e no meu bean tenho os métodos listeners todos bonitinhos com a assinatura correta, como em 
public void selecionarCategoriaEmpresa(ValueChangeEvent event);

No lançamento do primeiro evento(do primeiro combo que é o único visível na primeira atualização), tudo corre às mil maravilhas e o evento apropriado é realente chamado. Nele eu seto as flags de renderização dos componentes e os filtros(que também estão funcionando corretamente).

Acontece que no segundo passo, quando eu deveria ter o primeiro e o segundo combo habilitados e setados para os seus respectivos valueChangeListeners, ao executar uma mudança no segundo combo, para o meu desespero, o evento do primeiro é que é disparado e executado com sucesso, mas o segundo que é bom, nada…

Já tentei de inúmeras formas fazer da forma esperada este esquema funcionar, todas sem sucesso… já estou fazendo uma gambiarra, mas gostaria muito de fazer de um jeito mais elegante.

Alguém pode me dar uma luz?!?!?

p.s. -> Não há erros de validação no processo e eu já utilizei o immediate

6 Respostas

felipeguerra

Pq vc não usa o Ajax4Jsf?

S

ja tentou usar AJAX4JSF

dfalci

Não tenho propriedade aqui no serviço para colocar uma nova taglib. infelizmente… alguma idéia de como resolver com o que há disponível?!

felipeguerra

Pq o mesmo método nos dois componentes?

onchange="submit()"
dfalci

seguinte… eu estou dando o submit em cada um dos componentes porque a cada mundaça eu tenho que atualizar os lookups… atualizar a flag de exibição ou não de todos os componentes que dependem deste filtro e tal entende!!!

supondo que seja o exemplo do meu primeiro post lá… ao selecionar um novo estado, eu tenho que atualizar o terceiro combo para mostrar todas as cidades do estado selecionado. Além disso a flag de exibição ou não deste componente deve ser atualizada saka… acontece que os métodos flag de renderer estão sendo pegos antes de rodar o valuechangelistener… não importa se eu coloco o immediate ou não… ele sempre executa primeiro o getter da flag de renderização do componente antes que eu possa atualizá-la no valuechangelistener.

deu pra entender mais ou menos o problema?1?!?!

Leozin

nao precisa botar essa gambi de onchange = submit(), você pode colocar um “changeListener” no teu selectOneMenu

Criado 4 de janeiro de 2008
Ultima resposta 4 de jan. de 2008
Respostas 6
Participantes 4