accordionPanel中的JSF dataTable数据没有刷新



我有一个包含一个数据表的PrimeFaces手风琴的页面。手风琴选项卡和表格行可以通过按钮动态添加。现在我观察到一些关于数据绑定的奇怪现象。我可以看到我的手风琴选项卡(在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
}

解决方案很简单,但不容易找到和理解:在Primeface元素(p:accordionPanel)中使用ServerFace元素(例如h:dataTable)会导致意外和不可预测的行为。一旦我用相应的Primeface元素(例如p:dataTable)替换了嵌套在Primeface的accordion面板中的所有ServerFace元素,一切都如预期的那样工作。

最新更新