2011-08-31 74 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

相关问题