Fórum Capturar o evento change em um p:selectOneMenu do tipo Enum #516356
10/04/2015
0
Não consigo capturar o evento de mudança do componente p:selectOneMenu, cuja a fonte de carregamento é um enum. Registrei na minha view o evento change do Ajax, contudo o método do listener não é chamado.
A minha view utiliza o seguinte código para fazer o carregamento do combo:
O enum tem o seguinte código:
O meu ManagedBean possui o seguinte método usado para realizar o carregamento do combo:
O meu converter tem o seguinte código:
O método adicionado no listener do componente não imprime a informação no console, ou seja, não é acionado.
O combo carrega normalmente, mas o método changeComboAnalise() chamado no evento "change" não é executado.
A minha view utiliza o seguinte código para fazer o carregamento do combo:
<p:selectOneMenu id="analise" value="#{fooMB.analise}" converter="AnaliseConverter">
<f:selectItem itemLabel="Selecione"/>
<f:selectItems value="#{fooMB.carregarComboAnalise}" var="analise" itemLabel="#{analise.descricao}" itemValue="#/>
<f:ajax event="change" listener="#{fooMB.changeComboAnalise}"/>
</p:selectOneMenu>
O enum tem o seguinte código:
public enum AnaliseEnum {
AVALIACAO("Avaliação"),
SUGESTAO("Sugestão"),
RECLAMACAO("Reclamação"),
OUTROS("Outros");
private String descricao;
private AnaliseEnum(String descricao) {
this.descricao = descricao;
}
public String getDescricao() {
return this.descricao;
}
}
O meu ManagedBean possui o seguinte método usado para realizar o carregamento do combo:
public AnaliseEnum[] carregarComboAnalise() {
return AnaliseEnum.values();
}
O meu converter tem o seguinte código:
@FacesConverter(value = "AnaliseConverter")
public class AnaliseConverter extends EnumConverter {
public AnaliseConverter() {
super(AnaliseEnum.class);
}
}
O método adicionado no listener do componente não imprime a informação no console, ou seja, não é acionado.
public void changeComboAnalise(AjaxBehaviorEvent event) {
System.out.println("Deveria fazer alguma coisa aqui, mas não faz .... ");
}
O combo carrega normalmente, mas o método changeComboAnalise() chamado no evento "change" não é executado.
Geison Santos
Curtir tópico
+ 0
Responder
Posts
11/04/2015
Geison Santos
Bom, descobri o motivo de o método registrado no listener do componente p:selectOneMenu não ter sido invocado. Por algum motivo que desconheço estava ocorrendo alguma falha ema uma das fazes do ciclo de vida do request do JSF.
SOLUÇÃO
Para solucionar o problema adicionei ao componente selectOneMenu o atributo immediate="true". No meu caso, não é necessário passar por todas as fazes do ciclo de vida.
Uma de minhas suspeitas era a de que deveria utilizar o p:ajax no lugar de f:ajax o que se mostrou uma suspeita infundada, visto que a resolução do problema se ateve ao atributo immediate.
HERANÇA DO PROBLEMA
A partir da pesquisa para solucionar o problema acabei conhecendo o GenericEnumConverter do projeto OmniFaces desenvolvido por Bauke Scholtz, o BalusC, e Arjan Tijms. Este conversor substitui a necessidade de criar conversores específicos para Enums.
SOLUÇÃO
Para solucionar o problema adicionei ao componente selectOneMenu o atributo immediate="true". No meu caso, não é necessário passar por todas as fazes do ciclo de vida.
Uma de minhas suspeitas era a de que deveria utilizar o p:ajax no lugar de f:ajax o que se mostrou uma suspeita infundada, visto que a resolução do problema se ateve ao atributo immediate.
HERANÇA DO PROBLEMA
A partir da pesquisa para solucionar o problema acabei conhecendo o GenericEnumConverter do projeto OmniFaces desenvolvido por Bauke Scholtz, o BalusC, e Arjan Tijms. Este conversor substitui a necessidade de criar conversores específicos para Enums.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)