quarta-feira, 27 de maio de 2009

t:commandLink não funciona

Problema aparentemente não incomum mas comum para muitos. Adicionamos um t:commandLink na página e quando clicamos nele (depois de compilada e gerado HTML) não funciona. Isso pode acontecer por diversos motivos mas consideremos aqui apenas um cenário.

Cenário do meu problema:

Tudo funcionava muito bem até que um belo dia resolvi atualizar meu Tomahawk para poder utilizar algumas novidades atraentes a mim, como por exemplo o headercolspan do t:column. Eu utilizava a versão 1.1.5 e estava atualizando para mais recente 1.1.8. Troquei a lib rodei o projeto e Voilá!! Um t:commandLink que ficava no meu template parou de funcionar. Primeiro deu raiva, depois ódio, mas logo me acalmei e mandei todo o projeto para um lugar nada agradável para qualquer um.

Pensei um pouco e cheguei a conclusão de que o problema era o Myfaces como um todo. Ainda utilizava a versão 1.1.5 então resolvi updateala também para a versão mais nova 1.2.6. Finalmente percebi que o problema persistia e minha paciência não.

Resolvi dar uma olhada mais cuidadosa no erro através do firebug:
form is undefined
oamSetHiddenInput("linkDummyForm", "autoScroll", "0,0")principal.jsf (linha 25)
oamSubmitForm("linkDummyForm", "j_id5", undefined, undefined)principal.jsf (linha 63)
onclick(click clientX=290, clientY=86)w0aQNeZT...Jzg%3D%3D (linha 2)
if(typeof form.elements[name]=='undefined')
Pensei Que diabos é isso? Funcionava antes! Fui olhar o código javascript gerado pelo tomahawk:
var form = document.forms[formname];
if(typeof form.elements[name]=='undefined')
{
var newInput = document.createElement('input');
newInput.setAttribute('type','hidden');
newInput.setAttribute('id',name);
newInput.setAttribute('name',name);
newInput.setAttribute('value',value);
form.appendChild(newInput);
}
else
{
form.elements[name].value=value;
}

Debugando o código notei que seria obrigatório colocar o t:commandLink dentro de um form (ou h:form). Alguém pode até estar se perguntando porque eu não coloquei o componente dentro de um form. A resposta é simples, eu não precisava colocar porque eu não precisava de um form naquela região do template. Lembrando a todos que um template é, normalmente, usado para moldar as páginas do projeto (ou parte delas). O template no JSF é como o master page do .Net.

Solução:

Colocar o t:commandLink dentro de um form ou h:form (meu caso), como no código abaixo:
<h:form>
<t:commandlink action="#{meuBean.acao}">Link no template</t:commandlink>
</h:form>
Finalmente mais um problema solucionado e post lançado!!

Nenhum comentário:

Postar um comentário