当选择空选项时,Primefaces selectOneMenu不会调用ajax

时间:2015-01-06 12:46:08

标签: ajax jsf primefaces

我有一个Primefaces(版本3.4.1)selectOneMenu,当它被更改为更新另一个selectOneMenu时会触发ajax事件。

<p:outputLabel value="Órgão:" for="orgao" />
<p:selectOneMenu id="orgao" value="#{orcamentoAnualBean.orgao}" converter="orgaoConverter" requiredMessage="Favor escolher Órgão">
    <f:selectItem itemLabel="Selecione" itemValue="" noSelectionOption="true"/>
    <f:selectItems value="#{orcamentoAnualBean.listaOrgaos}" var="orgao" itemLabel="#{orgao.nome}" itemValue="#{orgao}" />
    <p:ajax update="revisao" listener="#{orcamentoAnualBean.mudancaDeImportacoes}" />
</p:selectOneMenu>

<p:outputLabel value="Revisão:" for="revisao" />
<p:selectOneMenu id="revisao" value="#{orcamentoAnualBean.importacaoFinanceiraSelecionada}" effect="fade" converter="importacaoConverter" required="true" requiredMessage="Favor escolher Revisão" disabled="#{empty orcamentoAnualBean.listaImportacaoFinanceira}">
    <f:selectItem itemLabel="Selecione" itemValue="" />
    <f:selectItems value="#{orcamentoAnualBean.listaImportacaoFinanceira}" var="importacao" itemLabel="#{importacao.exibicaoCombobox}" itemValue="#{importacao}" />
</p:selectOneMenu>

听众方法如下:

public void mudancaDeImportacoes(AjaxBehaviorEvent ev) {
    log.info("mudancaDeImportacoes: " + orgao);
    if (orgao != null && orgao.getId() != 0)
        listaImportacaoFinanceira = importacaoFinanceiraDAO.listar(orgao);
    else
        listaImportacaoFinanceira = new ArrayList<ImportacaoFinanceira>();
}

当我将 orgao selectOneMenu更改为非null值时,一切都按预期发生:转换器和侦听器被调用,集合 listaImportacaoFinanceira < / em>已满。但是,当我选择空选项时,既不会调用侦听器也不会调用转换器。

因此,我想知道这里缺少什么。在 Primefaces valueChangeListener or <p:ajax listener not firing for p:selectOneMenu 页面中,展示了如何使用selectOneMenu ajax事件。但是显然不适用于null值。

谢谢,

Rafael Afonso

编辑1

我尝试了另一种方法:在填写 listaOrgaos 集合时,我添加了一个没有ID的空Orgao:

        this.listaOrgaos = orgaoDAO.listarOrcamentoAnual();
        Orgao orgaoNulo = new Orgao();
        // orgaoNulo.setId(0);
        orgaoNulo.setNome("Selecione");
        this.listaOrgaos.add(0, orgaoNulo);

在转换器中,getAsString方法将返回Orgao的ID以放入value属性。 getAsObject会将Orgao通讯员返回ID,或null如果没有Orgao通讯员身份证或它不是有效号码(例如字面'null')。

如果 orgaoNulo ID为null,则不会调用转换器。否则,如果它为'0',则为文字'null',则调用转换器。无论如何,听众永远不会被召唤。就像只为非空值调用侦听器一样。是不是?

编辑2

我在这里做了一个惊心动魄的事。在Ajax事件标记中,我添加了对JS函数的调用,该函数将启用第二个选择,具体取决于第一个是否选择了有效值。

<p:outputLabel value="Órgão:" for="selOrgao" />
<p:selectOneMenu id="selOrgao" widgetVar="selOrgao" required="true"
    value="#{orcamentoAnualBean.orgao}" effect="fade"
    converter="orgaoConverter"
    requiredMessage="Favor selecionar o Órgão">
    <f:selectItem itemLabel="Selecione" value="#{null}" />
    <f:selectItems value="#{orcamentoAnualBean.listaOrgaos}"
        var="orgao" itemLabel="#{orgao.nome}" itemValue="#{orgao}" />
    <p:ajax update="selRevisao"
        listener="#{orcamentoAnualBean.mudancaDeImportacoes}"
        oncomplete="habilitarRevisao()" />
</p:selectOneMenu>

<p:outputLabel value="Revisão:" for="selRevisao" />
<p:selectOneMenu id="selRevisao" widgetVar="selRevisao"
    ...>
    ...
</p:selectOneMenu>

Javascript功能:

function habilitarRevisao() {
    if (!!selOrgao.getSelectedValue()) {
        selRevisao.enable();
    } else {
        selRevisao.disable();
    }
}

继续不调用验证器和侦听器。人们给我的建议没有用。因此,我必须实施此解决方法。

3 个答案:

答案 0 :(得分:1)

删除required="true"会纠正PrimeFaces 4.0.24中的问题。

答案 1 :(得分:1)

我也遇到了类似的问题。我在原始问题的EDIT 2中尝试了该解决方案。我被卡住是因为无法运行它,因为此selOrgao.getSelectedValue()抛出错误。因此,我执行了以下操作并使其起作用:

<p:ajax event="change" listener="#{backingBean.changeData}" oncomplete="updateFormDetails(args)"></p:ajax>

在脚本文件中,我执行了以下操作:

function updateFormDetails(args) {
if(args && args.validationFailed) {
     document.getElementById("selRevisao").addClass("disable");    
 } else {
     document.getElementById("selRevisao").removeClass("disable");   
}

并使用CSS使选择字段不可点击。

答案 2 :(得分:0)

如果需要第一个组合,您可以使用immediate="true"并尝试在侦听器中将您的值设为getSubmittedValue