【问题标题】:Why actionListener is called after ajax process using p:commandButton?为什么在使用 p:commandButton 的 ajax 进程之后调用 actionListener?
【发布时间】:2011-08-31 12:06:00
【问题描述】:

单击数据表中的按钮时,我试图打开一个对话框。该对话框包含另一个数据表,其中包含与按钮所属行相关的详细信息。 侦听器设置详细数据表所需的变量。 使用下面的 sn-p 似乎更新(以及详细数据表使用的列表的创建)是在触发 actionListener 之前执行的,因此对话框中的 dataTable 始终为空。 为什么?这是想要的行为吗?还有其他方法可以解决我的问题吗?

我使用了 action 而不是 actionListener,结果相同。

这是第一个数据表中的元素按钮:

                       <p:column style="width:16px;padding-left:4px;padding-right:4px;">  
                            <f:facet name="header">

                            </f:facet>
                            <p:commandButton image="ui-icon ui-icon-search"
                                             style="width:1.8em;height:1.8em"
                                             onsuccess="tDialog.show()"
                                             title="#{msgs.dettaglio}"
                                             process="@this, timbrature_dt"
                                             update="timbrature_dt"
                                             immediate="true"
                                             actionListener="#{dispCongediMBean.timbratureDettAction(dett)}">  
                            </p:commandButton>  
                        </p:column>

这是对话框:

       <p:dialog header="#{msgs.timbrature}" widgetVar="tDialog" resizable="false">  

                    <p:dataTable id="timbrature_dt" 
                                 value="#{dispCongediMBean.timbratureDataList}" 
                                 var="tdett">
                        <p:column>
                            <f:facet name="header">  
                                #{msgs.data}  
                            </f:facet>  
                            <h:outputText value="#{tdett.sDtComp}"/> 
                        </p:column>
                        ....

以下是调用顺序:

INFO: getTimbratureDataList
INFO: Nessuna timbratura.
INFO: getTimbratureDataList
INFO: Nessuna timbratura.
INFO: getTimbratureDataList
INFO: Nessuna timbratura.
INFO: getDettaglioDataList list dettaglio: 4
INFO: timbratureDettAction
INFO: gius corrente 315

如您所见,getTimbratureDataList() 方法在 actionListener timbratureDettAction() 之前调用,该方法正确设置了不幸未使用的值。

我正在使用 Glassfish 和 primefaces 2.1.1。

【问题讨论】:

    标签: ajax jsf jsf-2 primefaces actionlistener


    【解决方案1】:

    在我看来,您正在尝试同时处理当前按钮以及对话框内容本身。因为这意味着它需要重新构建组件树,所以当然会为详细对话框调用 getter。

    因此您只需要处理按钮,并且只重新渲染详细信息表: <p:commandButton image="ui-icon ui-icon-search" style="width:1.8em;height:1.8em" onsuccess="tDialog.show()" title="#{msgs.dettaglio}" process="@this" update="timbrature_dt" immediate="true" actionListener="#{dispCongediMBean.timbratureDettAction(dett)}">

    【讨论】:

    • 谢谢,但它不起作用。在这种情况下,单击按钮后永远不会调用 getTimbatureDataList。
    • 我发现解决问题的唯一方法是在命令按钮完成时触发另一个 ajax 请求(这是一个肮脏的解决方案):oncomplete="PrimeFaces.ajax.AjaxRequest('/econsob/faces/protected/disp_congedi_permessi_dettaglio.xhtml',{source:'dettaglio_dt:0:butt',process:'timbrature_dt', update:'timbrature_dt', oncomplete:function(xhr, status, args) {tDialog.show();}});"
    猜你喜欢
    • 2011-07-18
    • 2016-06-02
    • 2014-09-12
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多