JSF使用Ajax从另一个p:selectOneListbox更新p:selectOneMenu

时间:2014-10-29 11:27:18

标签: java ajax jsf primefaces

我一直在努力做一些非常简单的事情......但它不会起作用。

我有2" p:selectOneMenu",因此第二项取决于第一项中所选的项目。它们都在bean中有自己的方法来列出它们的项目。

我想要做的是当第一个更改其值时,更新另一个,以便组件应该考虑选择的对象重新加载列表。但是ajax永远不会发生,至少在调试中,Bean中的方法永远不会再被调用。

有什么问题?代码就像......

谢谢! :)

<p:selectOneMenu value="#{itemBean.lotacao}">
    <f:selectItem itemLabel="Choose one" />
    <f:selectItems value="#{itemBean.listLotacoes()}" 
        var="lotacao"
        itemLabel="#{lotacao.format()}" />
    <p:ajax update="localizacaoPorLotacao" />
</p:selectOneMenu>

<p:selectOneMenu id="localizacaoPorLotacao" 
    value="#{itemBean.localizacao}">
    <f:selectItem itemLabel="Choose one" />
    <f:selectItems value="#{itemBean.listByLotacao(itemBean.lotacao)}" />
</p:selectOneMenu>

@ManagedBean
@SessionScoped
public class ItemBean {

    // attributes, getters and setters here...

    public List<Lotacao> listLotacoes() {
        LotacaoService lotacaoService = new LotacaoService();  
        List<Lotacao> lotacoes = lotacaoService.getAll();       
        return lotacoes;
    }

    public List<Lotacao> listByLotacao(Lotacao lotacao) {
        if (lotacao == null) {
            return new ArrayList<Lotacao>();
        }

        String prefixo = lotacao.getCodigo().substring(0, 1);
        LotacaoService lotacaoService = new LotacaoService();  
        List<Lotacao> lotacoes = lotacaoService.getByPrefix(prefixo);

        return lotacoes;
    }

}

2 个答案:

答案 0 :(得分:2)

发现它!

缺少转换器使得JSF不会触发setter。 创建转换器并将其添加到OneMenu后,代码工作得很好。

最终版本是:

<p:selectOneMenu value="#{itemQuadroVagasBean.lotacao}" 
    converter="orgaoLotacaoCodigoConverter">
    <p:ajax event="change" 
        update="localizacaoPorLotacao" />       
    <f:selectItem itemLabel="Selecione a lotação" />
    <f:selectItems value="#{itemQuadroVagasBean.listarLotacoes()}" 
        var="lotacao"
        itemLabel="#{lotacao.formatarLocalizacao()}" />                                                             
</p:selectOneMenu>

答案 1 :(得分:0)

也许你需要活动:

<p:ajax update="localizacaoPorLotacao" event="change"/>