Почему actionListener вызывается после процесса ajax с использованием p: commandButton? - PullRequest
0 голосов
/ 31 августа 2011

Я пытаюсь открыть диалоговое окно, когда нажимается кнопка внутри таблицы данных. Диалог содержит другую таблицу данных с деталями, относящимися к строке, к которой принадлежит кнопка. Слушатель устанавливает переменную, которая требуется для таблицы подробных данных. Используя следующий фрагмент, кажется, что обновление (и, следовательно, создание списка, используемого таблицей подробных данных) выполняется до запуска 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 и основные лица 2.1.1.

1 Ответ

0 голосов
/ 31 августа 2011

Мне кажется, что вы пытаетесь обработать как текущую кнопку, так и само содержимое диалога.Поскольку это означает, что потребуется перестроить дерево компонентов, конечно, для диалогового окна сведений будет вызван метод получения.

Таким образом, вам нужно обработать только кнопку и повторно отобразить только таблицу сведений: <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)}">

...