Galera é o seguinte, não sei se alguém já passou por isso mas vamos lá, estou com uma tela onde a mesma possui uns campos <h:inputText> e <h:selectManyCheckbox> (onde esses estão bloqueados), sendo que de acordo com o que o usuário digitar nos <h:inputText> ele habilita o <h:selectManyCheckbox> correspondente.
Dúvida, já tentei quase td que e jeito de fazer funfar esse trem e nada, ou seja criei uma função Javascript que lê o conteúdo do <h:inputText> para habilitar o danado <h:selectManyCheckbox> mas nada, alguém teria alguma solução pra esse caso.
Funções javascript não vão te ajudar pois o JSF mantém o estado disabled=“true” tb no servidor. Assim, mesmo q vc use uma função javascript no cliente p/ ativar h:selectManyCheckbox o servidor ainda vai vê-lo como desativado. O q vc precisa fazer é enviar uma requisição ajax p/ o servidor e reativar o h:selectManyCheckbox lá, e então renderizar esse componente novamente no cliente.
Poste o restante do código da view e a versão do JSF q vc está utilizando p/ q eu possa de mostrar a solução.
P
Priuli
em um aplicação jsp eu consigo, mais ou menos assim:
functiononload{document.getElementById('meuCombo').disabled=true;varinput=document.getElementById('meuInputText');//Firefoxif(input.addEventListener){input.addEventListener('keydown',enableCombo,true);input.addEventListener('change',enableCombo,true);}//IEif(input.attachEvent){input.attachEvent('onkeydown',verificaEnableCombo,true);input.attachEvent('onchange',verificaEnableCombo,true);}}functionverificaEnableCombo(evt){if(document.getElementById('meuInputText').value=='IGUAL A ISTO')enableCombo();}functionenableCombo(){document.getElementById('meuCombo').disabled=false;}
agora no jsf… o evento pode ser na propria tag…
<h:inputText onkeyDown="verificaEnableCombo();"
se vc desabilitar o combo pelo jsf vc ira ter problemas se habilitar por javascript, (aquilo que o dev.rafael falou), eu tentaria deixar habilitado e desabilitar via javascript na tela.
Ta ok kra, me manda só o código do input text e do selectManyCheckbox com os quais vc está tento problemas e, na boa, coloca entre tag [code] pq senão ninguém consegue analisar.
O segredo aqui é vc associar o atributo desabled do h:selectManyCheckbox a alguma condição e não simplesmente true ou false. Assim quando vc alterar o valor do h:inputText vc envia uma requisição ajax e muda essa condição do servidor.
<h:inputTextid="textMunicipio"value="#{algum_mbean.textMunicipio}"size="20"maxlength="60"><!-- Aqui vc envia uma requisição ajax p/ o servidor td vez q o usuário digitar alguma coisa --><a4j:supportevent="onkeyup"reRender="cboxFilterMunicipio"/></h:inputText>
<!-- O atributo disabled fica vinculado ao tamanho do atributo do bean q está vinculado ao inputText. Assim td vez q o usuário digitar algo o servidor vai atualizar o componente no cliente --><h:selectManyCheckboxid="cboxFilterMunicipio"disabled="#{!empty algum_mbean.textMunicipio}"layout="pageDirection"label="Filtros para Município"><f:selectItemsid="idItemMunicipio"value="#{gmBean.filtroMunicipio}"/></h:selectManyCheckbox>
Infelizmente essa é a unica solução p/ o problema e ela ainda deve experimentar algum atraso caso o cliente não tenha uma conecção muito boa.
P
Priuli
Outra solução é metendo a mão no javascript e fazer o disabled por JavaScript..
<h:inputTextid="textMunicipio"value=""size="20"maxlength="60"onkeyup="javascript:habilitaFiltroMunicipioOnKeyUp(this.value);"/><h:selectManyCheckboxid="cboxFilterMunicipio"layout="pageDirection"label="Filtros para Município"><f:selectItemsid="idItemMunicipio"value="#{gmBean.filtroMunicipio}"/></h:selectManyCheckbox>
Crie um arquivo js e carrega no head da sua pagina.. e lá.. crie função para desabilitar por defaul.. exemplo
Qualquer solução usando javascript é insegura pois do ponto de vista do servidor o h:selectManyCheckbox sempre está ativado mesmo q no cliente ele esteja desativado. Soluções baseadas em javascript podem facilmente ser hackeadas através de recursos como o Firebug do Firefox ou as funcionalidades de suporte a desenvolvimento de browsers como o Chrome, Opera ou IE 8>. Basta vc inspecionar o código e mudar a propriedade disabled do componente. A unica solução garantida foi esse q eu informei.
P
Priuli
Verdade… o correto mesmo é utilizar as tag do jsf, a validação via JS fica sujeito a falhas de segurança… mais caso o jsf não consiga realizar há sim outra solução que deve ser tomada e com muita cautela e a segurança ficará na mão do desenvolv. q terá q fazer-manualmente
D
dadivajah
Gostaria muito de agradecer a grande ajuda, vlw dev.rafael e Priuli, pessoas assim tornam esse forum muito bom e respeitado.