【问题标题】:Primefaces ajax event change don't call listenerPrimefaces ajax 事件更改不调用监听器
【发布时间】:2014-05-08 16:34:35
【问题描述】:

嗯,我的 ManagedBean 中有一个方法可以重新加载我的 bean。这是我的 XHTML 代码:

<h:outputText value="Contrato: *" styleClass="bold" />
                        <p:selectOneMenu converter="entityConverter"
                            disabled="#{layoutExportacaoMB.bean.id != null}"
                            value="#{layoutExportacaoMB.contratoSelecionado}"
                            effect="fade" required="true" filter="true" filterMatchMode="contains"
                            requiredMessage="O Contrato é obrigatório">
                            <f:selectItem itemLabel="Selecione um Contrato" itemValue="" />
                            <f:selectItems value="#{layoutExportacaoMB.contratos}"
                                var="contrato"
                                itemLabel="#{contrato.numeroContratoFormatadoECliente}"
                                itemValue="#{contrato}" />
                            <p:ajax event="change" update="produtos" listener="#{layoutExportacaoMB.carregarProdutosContrato}" />
                        </p:selectOneMenu>

当用户更改此项目时,必须调用下面的方法,但这不会发生。我知道 ajax 事件更改被触发,因为我的组件“产品”已更新。

在 ManagedBean 上查看我的方法:

public void carregarProdutosContrato(){
    logger.info("Carregando contrato "+contratoSelecionado.getNumeroContratoFormatado());
    contratoSelecionado = (Contrato) getBoPadrao().findByNamedQuery(Contrato.FIND_COM_PRODUTOS_BY_ID, 
        new NamedParams("id", contratoSelecionado.getId()));
    }

解决方案:

解决方案比我想的更简单,只需在最后使用带有“()”的侦听器,看:

                    <p:ajax event="change" update="produtos" listener="#{layoutExportacaoMB.carregarProdutosContrato()}" />

为我工作。

【问题讨论】:

  • 代码中有很多杂音。很可能是转换/验证错误导致表单提交阻塞。在您的页面上放置一个&lt;p:messages/&gt; 组件以查看可能的错误
  • 错误的解决方案。您应该在 java 端的方法参数/签名中添加了正确的事件,而不是在 tge xhtml 的调用中添加 ()。其次,解决方案属于答案,而不是通过问题中的编辑

标签: jsf jsf-2 primefaces


【解决方案1】:

试试下面的:):

  1. 确保您的 &lt;p:selectOneMenu&gt; 位于 &lt;h:form&gt; 内。
  2. process="@this" 属性添加到您的&lt;p:ajax&gt;
  3. 添加&lt;p:growl&gt;globalOnly="false"autoUpdate="true" 可以帮助您识别任何验证和转换错误。

【讨论】:

  • 我不知道 14 年的情况如何,但是对于 primefaces 5.3 版 process 的默认值是 @this,您不必设置它。
【解决方案2】:

对我来说,问题在于对象值

<p:selectOneMenu value="#{userMB.getOneObject()}" ...

是未以某种方式连接到托管 bean 的对象(这里我通过函数调用得到它)。 selectOneMenu 的值应该是托管 bean 的属性,或者至少是保存在某个 jsf 范围内的属性。 这就是我对发生的事情的理解。希望能帮助到你。

<p:selectOneMenu value="#{userMB.oneObject}" ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2014-09-09
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多