【问题标题】:JSF Updating p:selectOneMenu from another p:selectOneListbox with AjaxJSF 使用 Ajax 从另一个 p:selectOneListbox 更新 p:selectOneMenu
【发布时间】:2014-10-29 11:27:17
【问题描述】:

我一直在尝试做一些非常简单的事情......但是它不起作用。

我有 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;
    }

}

【问题讨论】:

    标签: java ajax jsf primefaces


    【解决方案1】:

    找到了!

    该类缺少转换器使得 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>
    

    【讨论】:

      【解决方案2】:

      也许你需要事件:

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

      【讨论】:

      • 已添加,但什么也没发生。 :(
      • @Rafael Simonelli 是否调用了 #{itemBean.lotacao} 的设置器?
      • @RafaelSimonelli 你把你的组件放在h:form中了吗?
      • @Multisync 看起来很奇怪......不! :(
      • 我会调试setter没有被调用的原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多