为什么在使用p:commandButton的ajax进程之后调用actionListener?

时间:2011-08-31 12:06:00

标签: ajax jsf jsf-2 primefaces actionlistener

我正在尝试在单击数据表中的按钮时打开对话框。该对话框包含另一个数据表,其中包含与按钮所属行相关的详细信息。 侦听器设置详细数据表所需的变量。 使用以下代码段似乎在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。

1 个答案:

答案 0 :(得分:0)

在我看来,您正在尝试处理当前按钮以及对话框内容本身。因为这意味着它需要重建组件树,当然将为详细信息对话框调用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)}">