Primefaces DataTable和按钮调用问题

时间:2014-07-22 17:09:31

标签: jsf primefaces datatable

我有一个DataTable,它提供了一个产品列表:

     <p:dataTable var="product" value="#{myModel.products}"
            scrollable="true" id="productsTableId" liveResize="true"
            resizableColumns="true">

            <f:facet name="header">  
                List of products
            </f:facet>
            <p:column headerText="Id" sortBy="id">
                <h:outputText value="#{product.id}" > 
                </h:outputText>
            </p:column>

            <p:column headerText="Name" sortBy="name">
                <h:outputText value="#{product.name}" title="#{product.name}" />
            </p:column>

            <p:column headerText="Remove product">
                <p:commandButton icon="ui-icon-close" title="delete product"
                    value="Disconnect"
                    action="#{controller.delete(product)}"
                    update="productTableId">
                    <p:confirm header="Confirmation"
                        message="Are you sure you want to delete this product"
                        icon="ui-icon-alert" />
                </p:commandButton>
            </p:column>
</p:dataTable>

但问题出现在我尝试对数据表进行排序时,行会改变它们的diplay顺序,但按钮功能保持初始顺序,即。如果我有两个产品:

Id        Name      Remove product

1         B         Delete B
2         A         Delete A

按名称排序后

Id        Name      Remove product

2         A       Delete A
1         B       Delete B

如果我点击“删除A&#39;那么产品B被移除,这是PrimeFaces中的一个错误还是我遗漏了什么。

我在jetty-9.1.2上使用PrimeFaces 4.0,JSF Mojarra 2.1.20。

1 个答案:

答案 0 :(得分:0)

我找到问题的根源,将bean myModel设置为请求范围,我将其更改以查看范围

解释

当我们第一次加载页面时,创建并使用了一个托管bean myModel,当我们对数据进行排序时,会创建第二个托管bean,当我们点击删除按钮时,我们要求服务器删除该产品必须索引按下按钮的顺序,服务器首先尝试创建托管bean myModel的实例,然后查找已发布索引顺序的产品并将其删除。这个senario引起了这个问题。为了避免这种情况,我们使用视图范围来继续使用加载页面时创建的myModel的sapce实例。对于视图范围,将只在一个实例中创建并使用一个实例。