Usar selectItem com f:ajax

792 views
Skip to first unread message

Luxu

unread,
Jan 16, 2012, 2:11:31 PM1/16/12
to javasf: JavaServer Faces Group
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

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

Dionatan Hovoruski

unread,
Jan 16, 2012, 2:19:12 PM1/16/12
to jav...@googlegroups.com
Primeiro acho que não é possivel fazer como você quer...

Eu deixaria como abaixo e ao executar o evento executar algum listener para verificar se o valor é conforme você indicou.


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

Ou poderia fazer no campoTurmaReposicao um rendered="#{frequenciaBean.ativarReposicao.equals('Sim')}"

Dionatan Hovoruski

unread,
Jan 16, 2012, 2:22:36 PM1/16/12
to jav...@googlegroups.com
Apenas corrigindo o post anterior:
rendered="#{frequenciaBean.frequencia.presenca.equals('Sim')}"

Rafael Pestano

unread,
Jan 16, 2012, 2:23:01 PM1/16/12
to jav...@googlegroups.com
primeiro: f:ajax não tem a propriedade "update", utilize "render"

segundo:você deve utilizar o f:ajax diretamente no selectOneMenu e não dentro do selecItems
 
terceiro: geralmente se usa click no evento de um radio(eu sei que existe um bug no IE com evento change em radioButon) mas blur deve funcionar tbm.

 <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="click" render="campoTurmaReposicao"
listener="#{frequenciaBean.ativarReposicao}" />        
   
    </h:selectOneRadio> 

espero que ajude.
 
-- 
Att, 
Rafael M. Pestano
Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
Graduando em Ciência da Computação UFRGS

@realpestano
http://code.google.com/p/jsf-conventions-framework/

----- Mensagem original -----
De: Luxu <zica...@gmail.com>
Para: javasf: JavaServer Faces Group <jav...@googlegroups.com>
Cc:
Enviadas: Segunda-feira, 16 de Janeiro de 2012 17:11
Assunto: [javasf] Usar selectItem com f:ajax
--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Luxu

unread,
Jan 16, 2012, 2:43:08 PM1/16/12
to javasf: JavaServer Faces Group
num deu certo pois naum acessa o MB para atualizar o método, e naum
atualizando o método o rendered não atualiza...
Message has been deleted

Rafael Pestano

unread,
Jan 16, 2012, 3:00:58 PM1/16/12
to jav...@googlegroups.com
pode ser que esteja ocorrendo erro de validação em outra parte da tela tente:

<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 execute="@this" event="click" render="campoTurmaReposicao"
  listener="#{frequenciaBean.ativarReposicao}" /> 
 
 
-- 
Att, 

Rafael M. Pestano

Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
Graduando em Ciência da Computação UFRGS

@realpestano

De: Luxu <zica...@gmail.com>
Para: javasf: JavaServer Faces Group <jav...@googlegroups.com>
Enviadas: Segunda-feira, 16 de Janeiro de 2012 17:53
Assunto: [javasf] Re: Usar selectItem com f:ajax

num deu certo, Rafael, debugando o código ele nem entra no MB...


On 16 jan, 17:23, Rafael Pestano <rmpest...@yahoo.com.br> wrote:
> primeiro: f:ajax não tem a propriedade "update", utilize "render"
>
> segundo:você deve utilizar o f:ajax diretamente no selectOneMenu e não dentro do selecItems
>
> terceiro: geralmente se usa click no evento de um radio(eu sei que existe um bug no IE com evento change em radioButon) mas blur deve funcionar tbm.
>
>  <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="click" render="campoTurmaReposicao"
> listener="#{frequenciaBean.ativarReposicao}" />
>
>     </h:selectOneRadio>
>
> espero que ajude.
>
> --
> Att,
> Rafael M. Pestano
> Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
> Graduando em Ciência da Computação UFRGS
>
> @realpestanohttp://code.google.com/p/jsf-conventions-framework/
>
> ----- Mensagem original -----
> De: Luxu <zicad...@gmail.com>
> Você recebeu esta mensagem por que é membro do  Javasfhttp://groups.google.com/group/javasf

Luxu

unread,
Jan 16, 2012, 3:12:29 PM1/16/12
to javasf: JavaServer Faces Group
deu quase certo sim, só falta atualizar o componente seguinte para
renderizá-lo...

esse componente:

<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"
rendered="#{frequenciaBean.frequencia.presenca.equals(Não)}">
<f:selectItems value="#{frequenciaBean.turmas}" />
</h:selectOneMenu>
</p:fieldset>


On 16 jan, 18:00, Rafael Pestano <rmpest...@yahoo.com.br> wrote:
> pode ser que esteja ocorrendo erro de validação em outra parte da tela tente:
>
> <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 execute="@this" event="click" render="campoTurmaReposicao"
>   listener="#{frequenciaBean.ativarReposicao}" />
>
>
>
> --
> Att,
>
> Rafael M. Pestano
>
> Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul
> Graduando em Ciência da Computação UFRGS
>
> @realpestanohttp://code.google.com/p/jsf-conventions-framework/
>
> ________________________________

Luxu

unread,
Jan 16, 2012, 3:27:46 PM1/16/12
to javasf: JavaServer Faces Group
Deu certo galera, brigado...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>

Luxu

unread,
Jan 16, 2012, 3:28:45 PM1/16/12
to javasf: JavaServer Faces Group

Bruno Maomeh

unread,
Jan 16, 2012, 3:49:09 PM1/16/12
to jav...@googlegroups.com
você também pode tentar algo mais "orientado a objetos"..
dando a responsabilidade do teu objeto determinar se ele está presente ou não..
algo parecido com um método que retorne um boolean dentro de frequencia, possivelmente..

dae ficaria algo parecido com:
public boolean isPresente() {
   return presente.equals("sim"); //ou algo parecido
}

e na EL do render você apenas coloca algo como:
rendered=#{frequenciaBean.frequencia.presente}
Bruno Maomeh
   http://brunomaomeh.wordpress.com
Reply all
Reply to author
Forward
0 new messages