JSF - Carregar um selectOneMenu de acordo com a opção escolhida em outro

5 respostas
L

Olá, pessoal!

<h:selectOneMenu id="tipo" value="#{requisito.tipo}">

    <f:selectItems id="itemsTipo" value="#{requisito.itemsTipo}" />

</h:selectOneMenu>



<h:selectOneMenu id="nome" value="#{requisito.nome}">

    <f:selectItems id="itemsNome" value="" />

</h:selectOneMenu>

Eis o meu problema:

-requisito.itemsTipo é um arrayList e contém {sistema operacional, browser}.
-requisito.itemsNome1 é um arrayList e contém {Windows, Unix}.
-requisito.itemsNome2 é um arrayList e contém {Internet Explorer, Mozilla Firefox}.

-quando 'sistema operacional' for escolhido no select "tipo", o value de "itemsNome" deve receber #{requisito.itemsNome1}.

-quando 'browser' for escolhido no select "tipo", o value de "itemsNome" deve receber #{requisito.itemsNome2}.

-isso deve ser feito sem clicar no submit.

Alguém pode me ajudar??

Valeu.

5 Respostas

L

Coloque um ouvinte no selectOneMenu para um evento de mudança de valor.

Como fazer isso?

  1. Esquece as funções itemsNome1 e itemNome2. Haverá uma única função itemsNome no ManagedBean. (Depois vc vai enterder o porquê)

  2. Crie uma nova função do tipo “public void tipoMudou(ValueChangedEvent event)” no ManagedBean, o nome da função não importa muito, o importante é o retorno void e o parâmetro ValueChangedEvent do pacote javax.faces.event.ValueChangedEvent. Esse objeto event tem os métodos getNewValue() e getOldValue(), pega o novo valor e ponha num atributo privado (nem coloca get e set pra ele!) com o nome, sei lá, “tipo”.

  3. No método getItemsNome faça o algoritmo: se tipo for sistema operacional, retorna array1, se for browser, retorna array2.

  4. No primeiro selectOneMenu, faça assim:
    <h:selectOneMenu id=“tipo” value="#{requisito.tipo}" onchange=“submit()” immediate=true valueChangerListener="#{requisito.tipoMudou}">
    <f:selectItems id=“itemsTipo” value="#{requisito.itemsTipo}" />
    </h:selectOneMenu>

O que foi feito?
Sempre quando muda o valor da caixa de seleção, é mandado um submit no formulário, devido a “onchange”. Como existe um ouvinte registrado, ele é chamado e guarda o novo valor dentro do ManagedBean. Como existe immediate=“true”, o processo de validação será pulado (até porque não precisa nessa etapa). No segundo selectOneMenu será retornado apenas o array desejado, porque existe uma lógica condicional dependendo do atributo tipo, que foi modificado pelo listener.

Ok?

L

Eu de novo.

Ia me esquecendo, no método ouvinte (aquele que tem ValueChangedEvent como parâmetro) coloque na 1a linha:

FacesContext context = FacesContext.getCurrentInstance();

e na última linha:

context.renderResponse();

É só assim para pular o processo de validação.

afamorim

Esqueça isso, va no www.jboss.org, baixe o ajax4jsf e la tem exemplo de como você fazer isso sem ter que dar refresh, vai ficar mais elegante.
:smiley:

L

aê galera, valeu mesmo pelas dicas!!

:smiley:

Giulliano

afamorim:
Esqueça isso, va no www.jboss.org, baixe o ajax4jsf e la tem exemplo de como você fazer isso sem ter que dar refresh, vai ficar mais elegante.
:smiley:

o problema é deixar esse compnete funcionando…eu baixei os jar e até fiz funcionar muito bem…tanto o ajax4jsf quanto o sandbox (inpput SuggestedText) que vai autocompletando conforme vc vai escrevendo…mas aí de repente…

o ajax4jsf deixou de funcionar…ok ok …deixei pra lá…dali algumas semanas quem deixou de funcionar foi o sandbox…

sinceramente…o jsf ainda esta muito imaturo…ora que as listas de discussões estão na proporção de 70% norte-Americana e 30% Brasuca…

Criado 13 de julho de 2007
Ultima resposta 6 de ago. de 2007
Respostas 5
Participantes 4