gpt4 book ai didi

ajax - OmniFaces Ajax 实用程序的 updateColumn() 未更新 p :dataTable

转载 作者:行者123 更新时间:2023-12-02 03:54:49 27 4
gpt4 key购买 nike

最近,我的关于 OmniFaces Ajax.updateColumn() 的问题得到了如下回答:

How to use OmniFaces Ajax.updateColumn() or Ajax.updateRow() via p:ajax

在那种情况下,dataTable 是 JSF 标准 h:dataTable,而且效果很好。

现在,在这种情况下,当最终用户通过存在于 p:dataTable 之外的 p:calendar 组件选择日期时,我尝试更新 PrimeFaces p:dataTable。 p:dataTable xhtml如下:

<p:dataTable id="flightDataTable" var="flight" 
value="#{pf_flightController.flightsForOrder}">

<p:column headerText="Airport" style="text-align: center !important;">
<p:inputText value="#{flight.airportTx}" maxlength="25" size="10" label="Airport"/>
</p:column>

<p:column headerText="Airline" style="text-align: center !important;">
<p:inputText value="#{flight.airlineTx}" maxlength="25" size="10" label="Airline"/>
</p:column>

<p:column headerText="Flight Number" style="text-align: center !important;">
<p:inputText value="#{flight.flightNumber}" maxlength="8" size="10" label="Flight Number"/>
</p:column>

<p:column headerText="Type" style="text-align: center !important;">
<h:selectOneMenu value="#{flight.flightType}" label="Flight Type">
<f:selectItem itemValue="#{bundle.DropdownOptionValueArrive}" itemLabel="#{bundle.DropdownOptionLabelArrive}"/>
<f:selectItem itemValue="#{bundle.DropdownOptionValueDepart}" itemLabel="#{bundle.DropdownOptionLabelDepart}"/>
</h:selectOneMenu>
</p:column>

<p:column headerText="Date" style="text-align: center !important;">
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'N'}">
<p:calendar value="#{flight.flightDate}" navigator="true"
label="Flight Date"
pattern="MM/dd/yyyy" size="10">
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>
</h:panelGroup>
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'Y'}">
<p:inputText value="#{flight.flightDate}"
label="Flight Date" type="date">
<f:convertDateTime pattern="yyyy-MM-dd" />
</p:inputText>
</h:panelGroup>
</p:column>

<p:column headerText="Time" style="text-align: center !important;">
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'N'}">
<pe:timePicker value="#{flight.flightTime}"
label="Flight Time" mode="popup"
showPeriod="true" style="width: 80px;">
<f:convertDateTime pattern="hh:mm a" />
</pe:timePicker>
</h:panelGroup>
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'Y'}">
<p:inputText value="#{flight.flightTime}"
label="Flight Time" type="time">
<f:convertDateTime pattern="HH:mm" />
</p:inputText>
</h:panelGroup>
</p:column>

</p:dataTable>

最初和目前正在生产中,p:calendar p:ajax update="..."更新“整个”航类 p:dataTable,因此 p:dataTable 中的日期列已成功更新。我知道,我知道,如果它没坏,就不要修复它,但今天我正在修改这段代码和 xhtml,所以我想使用 OmniFaces Ajax 实用程序的 updateColumn() 只更新所有的“一个”列此 PrimeFaces p:dataTable 的行。

下面是终端用户通过p:calendar选择日期时执行的代码片段;这是调用 OmniFaces Ajax 实用程序的 updateColumn() 的代码。

private void updateFlightDateOnAdd() {
flightController.updateFlightDateOnAdd(current.getTripDateTime());

UIData flightsDataTable = null;
try {
flightsDataTable = (UIData) Components.findComponent(":orderAddForm:flightDataTable");
} catch (Exception e) {
System.out.println("pf_OrdersController.updateFlightDateOnAdd(): caught exception on Components.findComponent(...)");
}
if (flightsDataTable != null) {
System.out.println("pf_OrdersController.updateFlightDateOnAdd(): Components.findComponent(...) found " + flightsDataTable.getClientId());
Ajax.updateColumn(flightsDataTable, 4);
}
else {
System.out.println("pf_OrdersController.updateFlightDateOnAdd(): Components.findComponent(...) returned null");
}
}

下面是POJO定义:

public class FlightForOrder {
private Integer flightId;
private String airportTx, airlineTx, flightNumber;
private Character flightType;
private Date flightDate, flightTime;

public FlightForOrder() {

}

public Integer getFlightId() {
return flightId;
}

public void setFlightId(Integer flightId) {
this.flightId = flightId;
}

public String getAirportTx() {
return airportTx;
}

public void setAirportTx(String airportTx) {
this.airportTx = airportTx;
}

public String getAirlineTx() {
return airlineTx;
}

public void setAirlineTx(String airlineTx) {
this.airlineTx = airlineTx;
}

public Date getFlightDate() {
return flightDate;
}

public void setFlightDate(Date flightDate) {
this.flightDate = flightDate;
}

public String getFlightNumber() {
return flightNumber;
}

public void setFlightNumber(String flightNumber) {
this.flightNumber = flightNumber;
}

public Date getFlightTime() {
return flightTime;
}

public void setFlightTime(Date flightTime) {
this.flightTime = flightTime;
}

public Character getFlightType() {
return flightType;
}

public void setFlightType(Character flightType) {
this.flightType = flightType;
}

@Override
public int hashCode() {
int hash = 3;
hash = 97 * hash + Objects.hashCode(this.flightId);
return hash;
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final FlightForOrder other = (FlightForOrder) obj;
if (!Objects.equals(this.flightId, other.flightId)) {
return false;
}
return true;
}

}

测试时,服务器日志中显示以下内容:

INFO: pf_OrdersController.updateFlightDateOnAdd(): Components.findComponent(...) found orderAddForm:flightDataTable

所以,这意味着我获得了 PrimeFaces p:dataTable 的良好引用,所以我将 UIData 类型的组件传递给 Ajax.updateColumn()。

最终结果是,OmniFaces Ajax 实用程序的 updateColumn() 未更新 PrimeFaces 数据表。

我刚刚注释掉 Ajax.updateColumn(...) 并将 update="..."重新添加到 p:calendar p:ajax,然后 PrimeFaces 数据表已成功更新。

请告知我可能需要做什么来确保通过 Ajax.updateColumn(...) 更新 PrimeFaces 数据表。谢谢。

最佳答案

替换

<p:column headerText="Date" style="text-align: center !important;">
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'N'}">
<p:calendar value="#{flight.flightDate}" navigator="true"
label="Flight Date"
pattern="MM/dd/yyyy" size="10">
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>
</h:panelGroup>
<h:panelGroup rendered="#{pf_usersController.loggedInViaAndroid == 'Y'}">
<p:inputText value="#{flight.flightDate}"
label="Flight Date" type="date">
<f:convertDateTime pattern="yyyy-MM-dd" />
</p:inputText>
</h:panelGroup>
</p:column>

通过

<p:column headerText="Date" style="text-align: center !important;">
<p:calendar value="#{flight.flightDate}" navigator="true"
label="Flight Date"
pattern="MM/dd/yyyy" size="10"
rendered="#{pf_usersController.loggedInViaAndroid == 'N'}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>
<p:inputText value="#{flight.flightDate}"
label="Flight Date" type="date"
rendered="#{pf_usersController.loggedInViaAndroid == 'Y'}">
<f:convertDateTime pattern="yyyy-MM-dd" />
</p:inputText>
</p:column>

应该修复它。

解释:Ajax#updateColumn()仅将直接 子级的客户端 ID 添加到 PartialViewContext#getRenderIds() .但是,<h:panelGroup>它没有任何应该出现在生成的 HTML 输出中的属性,例如 id , 不会将任何内容渲染到 HTML 输出中。因此 JS/Ajax 无法找到 <h:panelGroup> 的 HTML 表示形式。以便对其进行更新。

此修复使表格单元格的具体内容成为直接 子元素,这样 JS/Ajax 就能够定位和替换它们。另一种方法是为这些小组提供具体的 id , 但在这个构造中这是不必要的。

关于ajax - OmniFaces Ajax 实用程序的 updateColumn() 未更新 p :dataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128299/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com