[Resolvido] Problema de AJAX no commandButton

10 respostas
M

Bom dia amigos...

escou com um grave problema, mas creio que foi a falta de conhecimento em AJAX.

Tenho um commandButton (primefaces) e estou querendo que ao clicar, ele atualize apenas a parte dos grids. O problema é que está me apresentando o seguinte erro ao ENTRAR na pagina XHTML.

exception 

javax.servlet.ServletException: <f:ajax> contains an unknown id ':frmGrids' - cannot locate it in the context of the component j_idt39
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

Estou posando também o código XHTML, apesar de extenso, talvez há alguma melhoria que alguém possa manifestar.....

<p:tab title="Caracterísitcas">
	<h:form id="frmCaract">
		<h:outputLabel style="width: 200px;"
			value="Caracterísitca da Ocorrência: " />
		<h:selectOneMenu styleClass="dropMedio"
			value="#{ocorrenciasBean.idCaracteristica}">
			<f:selectItem itemLabel="Escolha a Característica..."
				itemValue="" noSelectionOption="true" />
			<f:selectItems value="#{caractOcorrenciaBean.dataModel}"
				var="caract" itemValue="#{caract.id}"
				itemLabel="#{caract.descCaractOcorrencia}" />
		</h:selectOneMenu>
		<p:commandButton style="margin-left: 5px;"
			value="Guardar Característica" title="Guardar Característica"
			action="#{ocorrenciasBean.guardaCaract}">
			<f:ajax render=":frmGrids" />
		</p:commandButton>
	</h:form>
	<h:form id="frmGrids">
		<h:panelGroup id="panCaract"
			rendered="#{not empty ocorrenciasBean.ocorrencia.ocorrenciaCaracteristica}">
			<fieldset>
				<h2>Caracterísitcas da Ocorrência</h2>
				<p:dataTable
					value="#{ocorrenciasBean.ocorrencia.ocorrenciaCaracteristica}"
					var="caract" styleClass="dados"
					rowStyleClass="#{empty rowIx or rowIx mod 2 eq 0 ? 'impar' : 'par'}"
					rowIndexVar="rowIx">
					<p:column style="width:50%;" headerText="Característica"
						sortBy="#{caract.caractOcorrencia.descCaractOcorrencia}"> #{caract.caractOcorrencia.descCaractOcorrencia}</p:column>
					<p:column headerText="Ações">
					</p:column>
				</p:dataTable>
			</fieldset>
			<div class="Spacer"></div>
		</h:panelGroup>
	</h:form>
</p:tab>

10 Respostas

R

Cara,eu acho q o problema é que o nome do componente é ‘frmGrids’ e vc tá botando ‘:frmGrids’ ,com esse “:” na frente.

Hebert_Coelho

Se a dica do raf4ever naõ funcionar, eu acho que o problema ta no <h:form id=“frmGrids”> estar dentro do <p:tab title=“Caracterísitcas”>.

Coloque um id pro p:tab e aí chame :meuPanel:frmGrids (Não me lembro se é a sintax correta, mas tenta assim ou algo do tipo).

M

Em ambas eu fiz a alteração e restartei o tomcat....

Nem do jakefrog

exception 

javax.servlet.ServletException: <f:ajax> contains an unknown id ':panCaract:frmGrids' - cannot locate it in the context of the component j_idt38
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
Nem do raf4ever
description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: <f:ajax> contains an unknown id 'frmGrids' - cannot locate it in the context of the component j_idt38
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
Hebert_Coelho

Mas você tem que ver que todo componente que tenha um ID ele deve ser adicionado no update.

Você teria que colocar os 3 ids antes de chegar ao form.

thales_biolck

Já tentou colocar no seu h:form um prependId=“false” ?

<h:form id="frmCaract" prependId="false">

Ele vai deixar vc acessar os atributos diretamente , sem usar o id do form que é um naming container…

ai vc chama ele normal:

:frmCaract
Hebert_Coelho

thales_biolck:
Já tentou colocar no seu h:form um prependId=“false” ?

<h:form id="frmCaract" prependId="false">

Ele vai deixar vc acessar os atributos diretamente , sem usar o id do form que é um naming container…

ai vc chama ele normal:

:frmCaract

Mas aí até o código do panel são ignorados?

thales_biolck

tinha me esquecido panel… entao vc vai ter que colocar um prependId=“false” tambem dentro do p:panel

thales_biolck

tinha me esquecido panel… entao vc vai ter que colocar um prependId=“false” tambem dentro do p:panel

Hebert_Coelho

thales_biolck:
tinha me esquecido panel… entao vc vai ter que colocar um prependId=“false” tambem dentro do p:panel
Sabia dessa opção para panel não, achava que só existia para form.

Legal. [=

M

Boa tarde. Consegui uma solução conforme o código abaixo.

<p:commandButton ajax="false" style="margin-left: 5px;" value="Guardar Característica" title="Guardar Característica" action="#{ocorrenciasBean.guardaCaract}"> <f:ajax render=":frmGrids" /> </p:commandButton>

O que acontece é que o ajax do commandButton acaba sobrescrevendo o que você está tentando fazer dentro dele. Aí precisamos desabilitar o externo para que o interno funcione.

Criado 15 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 10
Participantes 4