Boa tarde pessoal.
O problema que estou tendo acontece quando eu re-renderizo o meu form a partir de uma requisição ajax. Feito isso acontece como se meus scripts JavaScript fossem desabilitados.
No geral tenho um template em facelets, onde estão os meus JavaScripts, através da tag:
<h:outputScript name="jquery-1.4.4.min.js" library="javascript" />
E o código do meu formulário com o botão com suporte a ajax é esse:
<h:form id="formulario_hospede" >
<h:panelGroup id="borda" layout="block" styleClass="borda_arredondada" >
<h:panelGroup id="info1" layout="block" rendered="#{cadastroFaces.primeiraParteCadastroHospede}" >
//Alguns componentes não importantes no momento ...
<h:commandButton id="continuar" value="#{msg.hospede_botao_continuar}" >
<f:ajax event="click" execute="@form" render="formulario_hospede" listener="#{cadastroFaces.cadastroHospedeAjaxActionListener}" />
</h:commandButton>
</h:panelGroup>
//Outros componentes também não importantes no momento ...
</h:panelGroup>
</h:form>
O erro acontece quando eu clico no botão e alguma validação de algum componente retorna um erro (Validator). É perceptível a “desativação” do JavaScript pois em meus componentes eu tenho máscaras e bordas arredondadas aplicadas pelo jQuery.
Alguém ai sabe o que pode estar acontecendo??
Pode está acontecendo que seus campos estão sendo re-renderizados e seus scripts não. Caso esteja utilizando o jQuery para mascarar os campos e provavelmente pelo seletor de id (#), por exemplo:
<script>
$("#campo").mascarar("99-999")
</script>
, este id (campo) foi re-renderizado, e ne caso vc tem que re renderizar o script que mascara o campo.
Para visualizar isso tenta colocar a chamada dos seus scripts (esses que colocam a máscara e as bordas arredondadas) dentro do form (já que o seu execute é @form).
Cara, é exatamente isso que está acontecendo. Meus componentes estão sendo re-renderizados porém meus scripts não.
Pra mim, como eu pedi pra re-renderizar somente o form, os scripts já ficam automaticamente amarrados a esses componentes.
Já tinha feito esse teste de colocar os scripts dentro do form e realmente funciona. Mas isso é uma boa prática ou apenas uma “gambi”??
O que você pode fazer é além de re renderizar o formulário, também re renderizar o local dos scripts, já que no execute="@form" pode colocar mais de um elemento, separados por um espaço em branco.
Desculpe a ignorância, mas como posso fazer isso (re-renderizar os scripts)?
Sei que no render do <f:ajax> ou execute pode-se colocar vários componentes identificados pelo seu id ou colocando como vc disse, @form ou @all, etc. Mas como faço isso pra um script??
Já tentei assim sem sucesso:
<span id="scripts">
<h:outputScript name="jquery-1.4.4.min.js" library="javascript" />
</span>
...
<h:commandButton id="continuar" value="#{msg.hospede_botao_continuar}" >
<f:ajax event="click" execute="@form" render="formulario_hospede scripts" listener="#{cadastroFaces.cadastroHospedeAjaxActionListener}" />
</h:commandButton>
Qual seria uma maneira de fazer isso?
em vez de:
<span id="scripts">
<h:outputScript name="jquery-1.4.4.min.js" library="javascript" />
</span>
tenta:
<h:panelGroup id="scripts">
<script type="text/javascript">
/* <![CDATA[ */
//teus scripts
/* ]]> */
</script>
</h:panelGroup>
A tag span não é jsf, então não é reconhecido para a renderização. E acho que você não precisa re renderizar o jQuery, e sim onde ele tá sendo usando para mascarar seus campos.
Importante!
No meu caso eu precisava de uma máscara de valor monetário. No evento ajax eu precisava re renderizar o próprio campo e o script que colocava a máscara.
O problema: se o script fosse colocado antes do campo a se rerenderizado não funcionava, se fosse declarado após o campo não tinha problema.
Não sei se é algum bug, mas acho que na resposta ajax ao retornar o script, este era executado imediatamente, e nesse momento o campo ainda não estava renderizado (pois estava abaixo do script), por isso o motivo de o script ter sido declarado após o campo.
Se alguém puder esclarecer essa dúvida…
ayslanms, funcionou perfeitamente.
Era exatamente isso que eu precisava. A tag span por não ser JSF não era reconhecida e assim me gerava um erro. Troquei pelo <h:panelGroup> e rodou normalmente.
Muito obrigado pela ajuda!!