首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当选择空选项时,Primefaces selectOneMenu不调用ajax

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

Stack Overflow用户
提问于 2015-01-06 12:46:07
回答 3查看 3.8K关注 0票数 2

我有一个Primefaces (Version3.4.1) selectOneMenu,它在更改为更新另一个selectOneMenu时触发ajax事件。

代码语言:javascript
运行
复制
<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>

侦听器方法如下:

代码语言:javascript
运行
复制
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。但是,当我选择空选项时,既不调用侦听器,也不调用转换器。

因此,我想知道这里缺少的是什么。在https://stackoverflow.com/questions/14956261/primefaces-valuechangelistener-or-pajax-listener-not-firing-for-pselectonemen页面中,将展示如何使用selectOneMenu ajax事件。但是,显然不适用于选择null值。

谢谢,

拉斐尔·阿丰索

编辑1

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

代码语言:javascript
运行
复制
        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,或者如果ID没有Orgao通讯器或它不是有效数字(例如文字'null'),则返回null

如果orgaoNulo ID为null,则不调用转换器。否则,如果它是'0‘ou一个文字'null',则调用转换器。不管怎么说,从来不叫听者。这就像只对非空值调用侦听器一样。是对的吗?

编辑2

我在这里醒了一觉。在Ajax事件标记中,我向JS函数添加了一个调用,它将启用第二个选择,这取决于第一个函数是否选择了一个有效值。

代码语言:javascript
运行
复制
<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函数:

代码语言:javascript
运行
复制
function habilitarRevisao() {
    if (!!selOrgao.getSelectedValue()) {
        selRevisao.enable();
    } else {
        selRevisao.disable();
    }
}

验证器和侦听器都继续不被调用。人们给我的建议不起作用。因此,我必须实现这个解决方案。

EN

回答 3

Stack Overflow用户

发布于 2019-06-04 13:34:37

我被一个类似的问题困住了。我在原题的第二版中尝试了这个解决方案。我被困住了,因为我无法让它工作,因为这个selOrgao.getSelectedValue()抛出了错误。因此,我做了以下工作,并使其发挥作用:

代码语言:javascript
运行
复制
<p:ajax event="change" listener="#{backingBean.changeData}" oncomplete="updateFormDetails(args)"></p:ajax>

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

代码语言:javascript
运行
复制
function updateFormDetails(args) {
if(args && args.validationFailed) {
     document.getElementById("selRevisao").addClass("disable");    
 } else {
     document.getElementById("selRevisao").removeClass("disable");   
}

并使用CSS使select字段不可点击。

票数 1
EN

Stack Overflow用户

发布于 2015-09-17 12:23:38

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

票数 0
EN

Stack Overflow用户

发布于 2015-11-01 03:59:54

如果需要第一个组合体,则可以使用immediate="true",并尝试在侦听器中以getSubmittedValue的形式获取值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27798982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档