我有一个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();
}
}
继续不调用验证器和侦听器。人们给我的建议没有用。因此,我必须实施此解决方法。
答案 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