Usar selectItem com f:ajax [RESOLVIDO]

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…

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

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

Ja que o tópico é sobre AJAX será que vcs podia mi ajudar aki?
Tenho o seguinte código:

[code]<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>[/code]

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!!

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?

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.

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

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

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

[code] <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>

[/code]

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

[/quote]

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

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?

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

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…

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

deu certo galera, solução:

[code] <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>

[/code]