Bom dia pessoal, tenho uma applicação WEB com JSF 1.1 e RichFaces 3.1.6, e uma página assim:
<h:form id="minhaForm">
<h:inputText id="valor_1" value="#{MeuBean.valor_1}">
<a4j:support event="onblur"
actionListener="#{MeuBean.fazAlgo}"
reRender="valor_2"/>
</h:inputText>
<h:outputText id="valor_2" value="#{MeuBean.valor_2}"/>
<h:commandButton id="btn_voltar"
immediate="true"
action="#{MeuBean.voltar}"/>
<h:commandButton id="btn_confirmar"
action="#{MeuBean.confirmar}"/>
</h:form>
O valor_2 é recalculado cada vez que o campo valor_1 perde o foco. Tudo bem.
Queria saber se existe uma maneira de NÃO CHAMAR o método “fazAlgo” quando a caixa de texto valor_1 perde o foco devido ao click no botão “voltar”, pois neste caso não preciso executar cálculos no valor_2, menos ainda renderizar novamente a caixa de texto valor_2.
Alguma sugestão?
patrizio, vc talvez pusse usar o aj4:function ao invés do a4j:support, pq assim vc poderia chamar um javascript e no javascript colocar uma regra que diz qdo chamar ou não o método no managed bean.
JSF 1.1 e RichFaces 3.1.6 tem cara de Scopus ou CPM Braxis
uma solução é você criar um flag no seu metodo chamado no onblur… depois que ele passar um vez não mais será executado.
Será que isso ajuda ?
Na verdade isso não ajuda muito, pois o método “fazAlgo” do bean deve ser chamado sempre que o inputText “valor_1” perde o foco (onblur), para recalcular o valor_2 que vai ser apresentado na tela.
Único caso em que não precisa (e não deveria) chamar é clicando no botão “voltar”.
Se vc tiver um flag que identifica que o botão voltar foi clicado, por exemplo um hidden, uma função javascript poderia avaliar se chamaria o método definido no
aj4:function
É verdade. Colocando “onblur” no h:inputText, consigo pegar o “document.activeElement”. Aí de repente posso tentar implementar uma lógica com javascript.
Pena que tenho esta caracteristica na aplicação inteira.
Uma tag JSF personalizada ia cair bem, visto que não parece existir um padrão para resolver este problema.
Vou tentar a solução do a4j:jsFunction, e vou postar o resultado aqui.
Obrigado a todos por enquanto.
Resolví da seguinte maneira, seguindo a sugestão do Rogerio:
function verificaBotaoVoltar() {
var componenteAtivo = document.activeElement;
if (componenteAtivo != null && componenteAtivo.id == 'minhaForm:btn_voltar') {
return true;
}
return false;
}
function chamarBeanViaAjax() {
if (!verificaBotaoVoltar()) {
funcaoCriadaPeloA4J();
}
}
E na página:
<a4j:jsFunction name="funcaoCriadaPeloA4J"
actionListener="#{MeuBean.fazAlgo}"
reRender="valor_2"/>
<h:inputText id="valor_1" value="#{MeuBean.valor_1}" onblur="chamarBeanViaAjax()"/>
Desta maneira, se o campo de texto perde o foco por causa do click no botão “Voltar”, o método do bean não é chamado.
Ainda fica o problema de como não aplicar os valores para os campos.