我有一个Primefaces (Version3.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。但是,当我选择空选项时,既不调用侦听器,也不调用转换器。
因此,我想知道这里缺少的是什么。在https://stackoverflow.com/questions/14956261/primefaces-valuechangelistener-or-pajax-listener-not-firing-for-pselectonemen页面中,将展示如何使用selectOneMenu
ajax事件。但是,显然不适用于选择null
值。
谢谢,
拉斐尔·阿丰索
编辑1
我尝试了另一种方法:在填充listaOrgaos集合时,添加了一个空的带有out 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,或者如果ID没有Orgao通讯器或它不是有效数字(例如文字'null'),则返回null
。
如果orgaoNulo ID为null
,则不调用转换器。否则,如果它是'0‘ou一个文字'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();
}
}
验证器和侦听器都继续不被调用。人们给我的建议不起作用。因此,我必须实现这个解决方案。
发布于 2019-06-04 13:34:37
我被一个类似的问题困住了。我在原题的第二版中尝试了这个解决方案。我被困住了,因为我无法让它工作,因为这个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使select字段不可点击。
发布于 2015-09-17 12:23:38
删除required="true"
纠正了PrimeFaces 4.0.24中的问题。
发布于 2015-11-01 03:59:54
如果需要第一个组合体,则可以使用immediate="true"
,并尝试在侦听器中以getSubmittedValue的形式获取值。
https://stackoverflow.com/questions/27798982
复制相似问题