2011-08-31 44 views
0

我試圖打開一個對話框,當點擊一個數據表中的按鈕。該對話框包含另一個數據表,其中包含與該按鈕所屬行相關的詳細信息。 偵聽器設置詳細數據表所需的變量。 使用下面的代碼片段看起來更新(以及創建詳細數據表使用的列表)在actionListener被觸發之前執行,因此對話框中的dataTable始終爲空。 爲什麼?那是想要的行爲嗎?有其他方法可以解決我的問題嗎?爲什麼在使用p:commandButton的ajax進程之後調用actionListener?

我用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()之前調用,它正確地設置了t他認爲不幸的是沒有使用。

我使用的是Glassfish和primefaces 2.1.1。

回答

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)}">

+0

謝謝,但它不工作。在這種情況下,getTimbratureDataList在按鈕點擊後不會被調用。 – maxqua72

+0

我發現解決這個問題的唯一方法是在命令按鈕完成時觸發另一個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();}});「' – maxqua72

相關問題