我有一个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。
答案 0 :(得分:0)
我找到问题的根源,将bean myModel
设置为请求范围,我将其更改以查看范围。
解释:
当我们第一次加载页面时,创建并使用了一个托管bean myModel
,当我们对数据进行排序时,会创建第二个托管bean,当我们点击删除按钮时,我们要求服务器删除该产品必须索引按下按钮的顺序,服务器首先尝试创建托管bean myModel
的实例,然后查找已发布索引顺序的产品并将其删除。这个senario引起了这个问题。为了避免这种情况,我们使用视图范围来继续使用加载页面时创建的myModel
的sapce实例。对于视图范围,将只在一个实例中创建并使用一个实例。