Esconder campos em tempo de execuÇÃo usando jsf

Bom dia amigos,

Gostaria de saber se usando JSF / RichFaces eu consigo esconder um <h:inputText/>.

O problema acontece, porque, eu tenho um formulário onde o primeiro campo é um selectItem. Dependendo da opção escolhida alguns campos serão ou não mostrados.

Minha dificuldade está em fazer isso sem dar submit na página. Alguém sabe como eu posso fazer isso ?
Alguém ideia ?

Obrigado a todos.

cara uma solução seria o uso de JAVASCRIPT :smiley:

Pois é,

Mas será que não existe um jeito mais “bonito” de fazer isso ?

lblanco eu faria ± assim:

Combo:

&lt;h:selectOneMenu valueChangeListener="#{meuBean.meuMetodo}"&gt; &lt;f:selectItems value="#{meuBean.valores}" /&gt; &lt;/h:selectOneMenu&gt;
Método do Bean:

public void meuMetodo(ValueChangeEvent event) { Long valor = (Long) event.getNewValue(); //verifica as condições e decide se renderiza o inputText ou não }

Você pode usar a4j também, aí deve ser ActionEvent:

&lt;h:selectOneMenu&gt; &lt;f:selectItems value="#{meuBean.valores}" /&gt; &lt;a4j:support event="onchange" ajaxSingle="true" reRender="seuInputText" actionListener="#{meuBean.meuMetodo}" /&gt; &lt;/h:selectOneMenu&gt;
…imagino que no método dependendo do valor do combo você setava para true or false a renderização do inputText, a propriedade reRender trataria deixando de exibir o componente ou não.
Não testei nada aqui, mas acredito que isso possa ti ajudar, qualquer dúvida poste aí.
Abraços,

Grande Fábio,

A segunda opção usando AJ4 , foi exatamente a forma que eu havia imaginado, porém não funciona em tempo de execução. Eu havia feito da mesma forma que você colocou, porém usando action ao inves de actionListener. Fiz o seu exemplo e nada acontece.

Vejam o meu código:

CAMPO TIPO DE CHAMADO

<h:selectOneMenu  id="tipo" label="#{bundle.textTipo}" value="#{AsController.selectedTipoChamado}" styleClass="cssList001">
                                <f:selectItems value="#{AsController.asTipoChamadoList}" />
                                 <a:support event="onchange"
                                            actionListener="#{AsController.searchAsTipoChamadoId}"
                                            immediate="true"
                                            ajaxSingle="true"
                                            reRender="operacao"/>
                            </h:selectOneMenu>

CAMPO OPERAÇÃO:
Obs: O Metodo AsController.searchAsTipoChamadoId que está sendo invocado no action do item acima é responsavel por setar true ou false para o atributo showFieldOp que está sendo usado no campo abaixo.


<h:inputText id="operacao" label="#{bundle.textOperacao}" value="#{AsController.selectedOperacao}"  styleClass="cssInputText001" rendered="#{AsController.showFieldOp}"/>

O processo está funcionando perfeitamente se eu der submit na página. Queria fazer isso sem submit.
And now ?

:frowning:

Abraços

Entendi, você quer que funcione sem o submit…bom, já tentou dar um binding no inputText?

&lt;h:inputText id="operacao" label="#{bundle.textOperacao}" value="#{AsController.selectedOperacao}"  styleClass="cssInputText001" rendered="#{AsController.showFieldOp}" binding="#{AsController.meuInputText}"/&gt;

No bean:

private HtmlInputText meuInputText;
//get e set

…daí no seu método AsController.searchAsTipoChamadoId que é responsável por setar true or false você seta a propriedade rendered do atributo “meuInputText”.
Bom, vou tentar testar aqui e ver se dessa forma funciona, lembro de ter feito algo parecido com um dataTable, mas naquele caso só o rendered igual você fez funcionou.

Legal,

Estou tentando aqui também, quem conseguir primeiro posta.
Valew Fabio, brigadão.

javascript não é feio rsrsrs
é uma possibilidade de vc tem de mudar algo sem precisar dar refresh na tela
outra opção seria usando ajax, usando binding não sei se consegue sem dar refresh

Acho que subestimei essa sua dúvida…rs…parecia ser simples mas “fritei” aqui…rs…
Bom, depois de tentar o que lhe sugeri e ver que não funcionou eu resolvi “apelar”, inseri um outputText e mandei imprimir a minha variável booleana, que informava se meu inputText seria renderizado ou não, e como esperado funcionava normalmente, agora porque o componente continuava sendo renderizado eu não sei explicar :oops:
O que eu fiz pra funcionar foi o seguinte:

&lt;a4j:support event="onchange" ajaxSingle="true" reRender="MEU_ID_DO_FORM" actionListener="#{meuBean.meuMetodo}" /&gt;

Feio né?, gambi mode on…rs…vou pesquisar isso com mai calma em casa, qualquer novidade eu posto aqui.

Abraços,

Digo o mesmo. No inicio achei que seria “mamãozinho” e estou a tarde toda nisso.
Mas me diga, esse ultimo post funcionou ? Se funfar vou deixar assim por enquanto.

Tenho um prazo pra entregar o projeto e não posso ficar perdendo tempo nisso rs.
Feio ? Que nada, você não imagina o que eu cheguei a fazer. Só pra sentir o drama , pensei em usar até iframe rsrsrsrsrss

valew, qualquer novidade eu posto também
Vamos ver se alguma alma caridosa leia o post e nos ajude.

Abraços e valew

Falae lblanco blz?
Sim funcionou, com o reRender=“MEU_ID_DO_FORM” o meu inputText deixava de ser renderizado quando necessário, mas cuidado, isso pode dar problemas com os outros componentes do seu form…antes de implementar isso como definitivo, tente solucionar de outra forma, não gostei de ter que renderizar todo o form para esconder um campo apenas :?
Se tiver alguma dúvida ou conseguir outra solução, poste aqui por favor.

Boa sorte, abraços!

Faz tempo que a pergunta esta ai mas acho que vale a pena responder para outros terem a resposta tb…
Acho que faltou só colocar o atributo onchange=“submit()” no h:selectOneMenu.
Para mim funcionou assim!


    <h:selectOneMenu onchange="submit()">  
          <f:selectItems value="#{meuBean.valores}" />  
          <a4j:support event="onchange" ajaxSingle="true" reRender="seuInputText" actionListener="#{meuBean.meuMetodo}" />  
    </h:selectOneMenu>