Usar selectItem com f:ajax [RESOLVIDO]

14 respostas
L

Galera preciso de uma solução: quero qdo o usuário clicar num dos itens do selectItem ele disparar o evento do f:ajax e renderizar um componente…fiz assim:

<p:fieldset id="Presença" legend="Presença" style="font-size:12px;">
								<h:selectOneRadio   id="frequencia-presenca" 
									value="#{frequenciaBean.frequencia.presenca}">
									<f:selectItem itemLabel="Sim" itemValue="Sim" />
									<f:selectItem  itemLabel="Não" itemValue="Não">
										<f:ajax event="blur" update="campoTurmaReposicao" listener="#{frequenciaBean.ativarReposicao}" />
									</f:selectItem>
								</h:selectOneRadio>
							</p:fieldset>

e ele retornou o erro:

Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/StudioPilates] threw exception [/formularios/formularioFrequencia.xhtml @72,108 <f:ajax> Unable to attach <f:ajax> to non-ClientBehaviorHolder parent] with root cause
javax.faces.view.facelets.TagException: /formularios/formularioFrequencia.xhtml @72,108 <f:ajax> Unable to attach <f:ajax> to non-ClientBehaviorHolder parent
	at com.sun.faces.facelets.tag.jsf.core.AjaxHandler.applyNested(AjaxHandler.java:297)
	at com.sun.faces.facelets.tag.jsf.core.AjaxHandler.apply(AjaxHandler.java:174)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:184)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)

o q a meu ver parece que não se pode aplicar o f:ajax nesse componente, alguma solução? Desde já obrigado…

14 Respostas

J

Troca o itemValue do SelectItem de Sim/Não para True/False e põe o <f:ajax> dentro do <h:SelectOneRadio>

H

Além de fazer o acima, coloca change ao invés de blur no event.

X
Ja que o tópico é sobre AJAX será que vcs podia mi ajudar aki? Tenho o seguinte código:
<h:panelGrid>
...
 <h:outputLabel value="Diretor de turma:" for="ddt" />
					<h:selectOneRadio id="ddt"
						value="#{professorBean.professor.diretorDeTurma}">

						<f:selectItem itemLabel="Sim" itemValue="Sim" />
						<f:selectItem itemLabel="Nao" itemValue="Nao" />
						<a4j:support event="click" reRender="opcoes" />
					</h:selectOneRadio>
				</h:panelGrid>
				
				<h:panelGrid columns="2" id="opcoes" rendered="#{professorBean.professor.diretorDeTurma eq 'Sim'}"> <!-- ou == 'Sim' -->  
					<h:outputLabel value="Turma:" for="turma" />
					<h:inputText id="turma"
						value="#{professorBean.professor.turma}" />
				</h:panelGrid>
O campo Turma só era para aparecer se for marcador SIM no campo acima, só que ele não aparece de jeito algum... Alguém sabe o porque?? OBG!!
L

mas eu queria q o evento fosse dsparado só qdo o usuário selecionasse o NÃO se selecionasse SIM naum fazer nda, isso q vc me passaram resolveria o problema?

H

Eu sei que tem como você colocar required no h:selectOneRadio e lá dentro além da lista você pode colocar um f:selectItem e marcá-lo como sendo o cara required.

L

naum deu certo, axo q naum vai ter como fazer…se algum tiver uma luz…

X

alguem viu meu problema lá em cima???
:smiley:

L

xandi_m5, veja meu exemplo e tente entender, explico depois o q ele faz, se vc naum souber claro...

<p:panel id="panelEditar" rendered="#{not empty frequenciaBean.frequencia.aluno.nome}" style="width:650px;">
						<h:panelGrid columns="5">
							<p:fieldset id="Nome" legend="Nome" style="font-size:12px; width:100px;">
								<h:outputText  value="#{frequenciaBean.frequencia.aluno.nome}"/>
							</p:fieldset>
						
							<p:fieldset id="Data" legend="Data" style="font-size:12px;">
								<h:outputText value="#{frequenciaBean.frequencia.data}">
									<f:convertDateTime pattern="dd/MM/yyyy" />
								</h:outputText>
							</p:fieldset>
						
								<p:inplace label="Presença">
									<h:selectOneMenu value="Presença">
										<f:selectItem itemLabel="Sim" itemValue="Sim" />
										<f:selectItem  itemLabel="Não" itemValue="Não"/>
									</h:selectOneMenu>
								</p:inplace>
								
	
							<p:fieldset legend="TurmaReposicao" style="font-size:12px;">
								<h:selectOneMenu id="campoTurmaReposicao" value="#{frequenciaBean.tur_codigo}"
									title="Selecione uma turma"
									required="true" requiredMessage="Campo [Turma] obrigatório"
									disabled="#{frequenciaBean.repor == false}">
									<f:selectItems value="#{frequenciaBean.turmas}" />
								</h:selectOneMenu>
							</p:fieldset>
						
	
						</h:panelGrid>
						<p:commandButton id="btAtualizar" value="Atualizar" ajax="false"
							update="panelEditar formTabela"
							action="#{frequenciaBean.atualizar}"/>
						<p:commandButton id="btCancelar" value="Cancelar" ajax="false"
							action="#{frequenciaBean.cancelar}"
							update="panelEditar" />
					</p:panel>
X

luxu:
xandi_m5, veja meu exemplo e tente entender, explico depois o q ele faz, se vc naum souber claro…

Obrigado!
Mais eu só consegui identifica AJAX no final e não entendi oq ele vai fazer… :S
Se pode explica eu agradeço… =D

L

esse panel só aparece pro usuário qdo no MB o campo nome do aluno NÃO for vazio rendered="#{not empty frequenciaBean.frequencia.aluno.nome}", ou seja, vc tem q testar o rendered mas quem vai responder é lá no MB sacou?

X

Pode mostra como tá o essa parte no MB ???

L

seria o objeto frequencia que qdo clico no alterar na minha tabela ele carrega todos os dados dessa linha no MB, ou seja, o nome do aluno vem junto…

X

Entendi…
Mais no meu caso eu quero que venha um campo para se preenchido… :S

L

deu certo galera, solução:

<p:fieldset id="Presença" legend="Presença" style="font-size:12px;">
								<h:selectOneRadio id="frequencia-presenca" value="#{frequenciaBean.frequencia.presenca}">
									<f:selectItem itemLabel="Sim" itemValue="Sim" />
									<f:selectItem  itemLabel="Não" itemValue="Não"/>
									<p:ajax event="click" update="campoTurmaReposicao"/>
								</h:selectOneRadio>
							</p:fieldset>
	
							<p:fieldset id="campoTurmaReposicao" legend="TurmaReposicao" style="font-size:12px;">
								<h:selectOneMenu  value="#{frequenciaBean.tur_codigo}"
									title="Selecione uma turma"
									required="true" requiredMessage="Campo [Turma] obrigatório"
									rendered="#{frequenciaBean.frequencia.presenca.equals('Não')}">
									<f:selectItems value="#{frequenciaBean.turmas}" />
								</h:selectOneMenu>
							</p:fieldset>
Criado 16 de janeiro de 2012
Ultima resposta 16 de jan. de 2012
Respostas 14
Participantes 4