我试图打开一个对话框时,一个数据表内的按钮被点击。对话框包含另一个数据表,其中包含与按钮所属行相关的详细信息。侦听器设置详细数据表所需的变量。使用下面的代码片段,似乎更新(以及详细数据表使用的列表的创建)是在触发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.
在我看来,您正在尝试处理当前按钮和对话框内容本身。因为这意味着需要重新构建组件树,所以当然要为细节对话框调用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)}">