quinta-feira, 9 de setembro de 2010

JSF e os campos disabled

Meu projeto é JSF (sun) + RichFaces + Jquery para a camada de View. E olha só o que o destino me reservou.

Eu tinha os seguintes campos:
<h:inputText value="#{mBeanMeuBean.atributo1}" style="botoesChatos" id="meuCampo1" disabled="#{mBeanMeuBean.edicao}"/>
<a4j:commandLink id="btnEditarCampo1" rendered="#{mBeanMeuBean.edicao}" oncomplete="liberarEdicao('meuCampo1', this);" value="Habilita Campo 1"/>


<h:inputText value="#{mBeanMeuBean.atributo2}" style="botoesChatos" id="meuCampo2" disabled="#{mBeanMeuBean.edicao}"/>
<a4j:commandLink id="btnEditarCampo2" rendered="#{mBeanMeuBean.edicao}" oncomplete="liberarEdicao('meuCampo2', this);" value="Habilita Campo 2"/>


Isto é, são dois campos inicialmente desabilitados, em que é necessário clicar num link antes de abrí-los para edição. À prova de usuário distraído.
O javascript 'liberarEdicao' se limita a retirar o atributo 'disabled' do campo via jQuery e sumir com o link.

Simplesmente, mesmo clicando no link próprio, mexendo no campo, mandando para o mBean via a4j:commandButton, a modificação NÃO chegava lá por nada. Como se tivesse um 'immediate=true', o que não tinha. É verdade que esse bean tinha keepAlive, mas o que raios ocorria?

Pensei que fosse alguma coisa no meu salvar, que não estivesse habilitando os campos antes de enviar (já tive este problema no Struts). Lá vou eu colocar no onclick do meu salvar:

onclick="jQuery('.botoesChatos').removeAttr('disabled');"

Mas, pasmém, isso NÃO resolveu. Tirei isso do botão, mas retirei o 'disabled' do h:commandButton e passei para o jquery no onload da página.


jQuery(function() {

if(edicao){
jQuery('.botoesChatos').attr('disabled', 'disabled');
}
});

Agora o problema mudou. Os campos que eu realmente editava/habilitava, chegavam no bean. Se eu editasse apenas um, o outro não era enviado. Aí achei que era o problema de habilitar antes de mandar salvar e, de fato, ao recolocar o onclick que citei acima, resolveu.


D'onde tiro que: ao colocar um campo como 'disabled' direto na tag h:inputText, o JSF *NÃO* vai trazer esse cara de volta nem que vc mude-o por javascript. Colocando este 'desabilitar' via jQuery, vc tem que obrigatoriamente habilitá-lo antes de enviar, senão este campo também não será enviado.

Alguma outra sugestão?

Um comentário:

  1. O problema é relativo a como o browser envia o form. Aparentemente o padrão é que ele somente envia dados de campos input que já vêm habilitados. Uma opção é tentar utilizar readonly nos campos input ao invés do disabled, talvez não dê o problema que ocorreu inicialmente.

    Pode ser também que a treeStructure da view da pagina não saiba que precisa receber dados dos campos que estavam disabled, visto que inicialmente eles estão disabled=true e a alteração para disabled=false somente está ocorrendo no cliente, e assim a view não é atualizada no servidor com essa informação.

    Ou pode não ser nada disso. =)

    ResponderExcluir