我有一个包含一个包含dataTable的PrimeFaces Accordion的页面。可以使用按钮动态添加Accordion Tabs和Table行。现在我观察有关数据绑定的奇怪事情。我可以看到我的手风琴选项卡(代表Java中的OrderProducts)绑定到我的bean并随时更新。 dataTable行并不总是绑定到它们对应的bean(OrderDestination),因此在提交后并不总是更新数据。第一个选项卡似乎按预期工作,但在第二个选项卡中(如果我添加第二个选项卡)绑定不起作用。此外,我尝试向构造函数中的每个新OrderProduct添加一个空的OrderDestination(在下面的代码中不可见)。此默认OrderDestination永远不会绑定到bean。我做错了什么,或者你能否发现以下代码中的任何错误或误解?
orderCreate.xhtml(简化)
<h:form id="orderPlaceForm">
<p:accordionPanel id="productAccordion" value="#{orderCreateModel.orderProducts}" var="product">
<p:tab>
<h:dataTable var="item" value="#{product.orderDestinations}">
<h:column>
<h:inputText value="#{item.totalWeightKg}">
</h:column>
<!-- other columns -->
</h:dataTable>
<!-- button to add another row -->
<h:commandButton value="add dest" action="#{orderCreate.addDestination}">
<f:param name="productId" value="#{product.uuid}" />
<f:ajax render="productAccordion" execute="@this productAccordion"/>
</h:commandButton>
</p:tab>
</p:accordionPanel>
<!-- button to add another tab -->
<h:commandButton value="add prod" action="#{orderCreate.addProduct}">
<f:ajax render=":orderPlaceForm:productAccordion" execute="@this :orderPlaceForm:productAccordion"/>
</h:commandButton>
</h:form>
OrderCreate.java
@ManagedBean
@RequestScoped
public class OrderCreate {
@ManagedProperty(value="#{orderCreateModel}")
private OrderCreateModel orderCreateModel;
public void addProduct() {
orderCreateModel.addProduct();
}
public void addDestination() {
orderCreateModel.findProduct(prodId).addDestination(); //prodId from FacesContext
}
}
OrderCreateModel.java
public class OrderCreateModel {
private List<OrderProduct> orderProducts = new ArrayList();
public void addProduct() {
orderProducts.add(new OrderProduct());
}
public OrderProduct findProduct(UUID prodID) {
//look in orderProducts for prodID
}
}
OrderProduct.java
public class OrderProduct {
private List<OrderDestination> orderDestinations = new ArrayList();
public void addDestination() {
orderDestinations.add(new OrderDestination());
}
}
OrderDestination.java
public class OrderDestination {
//POJO with some String fields
}
答案 0 :(得分:0)
解决方案很简单,但不容易找到和理解:
在Primeface元素(p:accordionPanel)中使用ServerFace元素(例如h:dataTable
)会导致意外和不可预测的行为。只要将Primeface的手风琴面板中嵌套的所有ServerFace元素替换为相应的Primeface元素(例如p:dataTable
),一切都按预期工作。