我正在尝试使用OmniFaces 1.3(SNAPSHOT)Ajax实用程序的Ajax.updateColumn()方法。更具体地说,我想用Ajax.updateColumn(table,1)代替使用p:ajax update =“:pageContentPanel”,它是一个h:panelGroup(或p:outputPanel),其中包含以下xhtml。
<h:dataTable id="dt_tripDates" style="width: 200px !important;" var="tripDate" value="#{pf_ordersController.tripDates}"> <p:column style="text-align: right !important;"> <h:outputText id="rowNumber" value="#{tripDate.rowNumber}" /> </p:column> <p:column style="text-align: center !important;"> <p:calendar id="tripDate" value="#{tripDate.tripDate}" size="16" label="Trip Date" pattern="MM/dd/yyyy" navigator="true" onchange="changeOthersOnDateChange(this);"> <p:ajax partialSubmit="false" event="dateSelect" listener="#{pf_ordersController.tripDateSelectedOnAddUsingTemplate}" update=":pageContentPanel"/> <f:convertDateTime pattern="MM/dd/yyyy" /> </p:calendar> </p:column> </h:dataTable>
在Bean中,我具有以下内容,这些内容由p:ajax listener =“ …”引用:
public void tripDateSelectedOnAddUsingTemplate(DateSelectEvent event) { DateTime dt, today = DateTime.now(), tripDateTime = new DateTime(event.getDate()); String clientId = event.getComponent().getClientId(); Integer pos = clientId.indexOf(":tripDate") - 1, rowNumber = Integer.valueOf(clientId.substring(clientId.lastIndexOf(":", pos) + 1, pos + 1)); /* * clientId = orderAddUsingTemplateForm:dt_tripDates:0:tripDate * id = tripDate */ /* * if tripDates in the list, that follow the argument tripDate in the list, * have today's Date, then set them to the argument */ for (int i = rowNumber; i < nbrOfTripDates; i++) { tripDates.get(i).setTripDate(tripDateTime.toDate()); } // OmniFaces Ajax utility to update UIData columns Ajax.updateColumn(tripDatesDataTable, 1); }
尝试使用Ajax.updateColumn()时,我将“ HtmlDataTable tripDatesDataTable”作为该bean的属性添加了。
该bean是JSF @SessionScoped托管bean。请让我知道执行p:ajax(属于上述xhtml中的p:calendar)时如何调用Ajax.updateColumn()。谢谢。
关键点是,您必须以UIData某种方式拥有该组件的句柄,才能将其传递给Ajax#updateColumn()。在您的特定情况下,最简单的方法是event.getComponent()借助Components#getClosestParent()。
UIData
Ajax#updateColumn()
event.getComponent()
Components#getClosestParent()
UIData tripDatesDataTable = Components.getClosestParent(event.getComponent(), UIData.class); // ... Ajax.updateColumn(tripDatesDataTable, 1);
请注意,您也可以通过这种方式获取行号,而无需分解客户端ID。
int rowNumber = tripDatesDataTable.getRowIndex();