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?