PrimeFaces 5.1 p:datatable 过滤器被更新数据表破坏
PrimeFaces 5.1 p:datatable filter is destroyed by update datatable
我正在将我的 Web 应用程序更新到 PF5.1(之前是 PF4.0)
<p:dataTable>
组件的简单更新现在完全破坏了我的数据表 FILTER。
update=":#{p:component('tbl_queue')}"
由于新的 PF5.1 版本,我不得不更改我的列过滤器,所以我修改了我的过滤器:
<f:facet name="filter" >
<p:selectOneMenu ... >
<f:selectItem ... />
<f:selectItems ... />
</p:selectOneMenu>
</f:facet>
旧的过滤器版本是:
<p:column id="..."
filterBy=...
filterOptions="..."
filterMatchMode="exact"
>
...
</p:column>
编辑:我的要求很简单,就是通过选择对过滤后的数据表进行删除(并使过滤器保持活动状态)。 PF4.0 可以,PF5 好像不行。
像那样:
第 1 步:过滤数据表
第 2 步:通过单击删除一行 'Envoyer' = 删除 (J91GT N9 03:17:00)
它在 PF4 上运行良好,但我找不到在 PF5 上执行相同操作的解决方案。
编辑 2:
<p:dataTable id="tbl_queue" var="c"
value="#{queueModificationController.cartQueue}"
widgetVar="queueTable"
filteredValue="#{queueModificationController.filteredCartQueue}"
rowKey = "#{c.id}"
>
<p:column
id="Bumper_column"
filterBy="#{c.name_bumper}"
headerText="Bumper"
filterMatchMode="exact"
>
<f:facet name="filter" >
<p:selectOneMenu onchange="PF('queueTable').filter()" id="selectFilterBumper" >
<f:selectItem itemLabel="Aucun" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{queueModificationController.nameBumperOptionsString}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{c.name_bumper}" />
</p:column>
<p:column>
//...
</p:column>
//...
//...
<p:column id="validation_column"
headerText="Validation">
<p:commandButton
action="#{productionQueue.updateAfterSending()}"
value="Validation"
update=":#{p:component('tbl_queue')}"
<f:setPropertyActionListener value="#{c}"
target="#{productionQueue.selectedCart}" />
</p:commandButton>
</p:column>
</p:dataTable>
--
@ManagedBean(name = "productionQueue")
@SessionScoped
private ArrayList<CartInQueueConsult> cartQueue; //filled by Database in bean initialisation
private ArrayList<CartInQueueConsult> filteredCartQueue = new ArrayList<CartInQueueConsult>(cartQueue);
public void updateAfterSending()
{
... (remove in database)
filteredCartQueue.remove(selectedCart);
cartQueue.remove(selectedCart);
}
编辑:MCVE 错误示例:
错误:
- 1:过滤器不工作(奇怪的是因为我所有的过滤器都在无 MVCE 示例中正常工作
- 2:当您使用按钮 "Remove" 删除一行时,过滤器被破坏(我最初的问题)
import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
@ManagedBean(name = "testController")
@ViewScoped
public class TestController implements Serializable
{
private ArrayList<String> cartQueue;
private String selectedCart;
private ArrayList<String> filteredCartQueue;
private SelectItem nameBumperOptionsString[] = {new SelectItem(1,"1"),new SelectItem(2,"2"),new SelectItem(3,"3"),new SelectItem(4,"4"),new SelectItem(5,"5")};
@PostConstruct
public void initialize()
{
cartQueue = new ArrayList<String>();
cartQueue.add("1");
cartQueue.add("2");
cartQueue.add("3");
cartQueue.add("4");
cartQueue.add("5");
cartQueue.add("6");
filteredCartQueue = cartQueue;
}
public void remove()
{
try
{
filteredCartQueue.remove(selectedCart);
cartQueue.remove(selectedCart);
}
catch (Exception ex)
{
System.out.println("EXCEPTION : "+ ex.getMessage());
}
}
public ArrayList<String> getFilteredCartQueue() {
return filteredCartQueue;
}
public void setFilteredCartQueue(ArrayList<String> filteredCartQueue) {
this.filteredCartQueue = filteredCartQueue;
}
public SelectItem[] getNameBumperOptionsString() {
return nameBumperOptionsString;
}
public void setNameBumperOptionsString(SelectItem nameBumperOptionsString[]) {
this.nameBumperOptionsString = nameBumperOptionsString;
}
public ArrayList<String> getCartQueue() {
return cartQueue;
}
public void setCartQueue(ArrayList<String> cartQueue) {
this.cartQueue = cartQueue;
}
public String getSelectedCart() {
return selectedCart;
}
public void setSelectedCart(String selectedCart) {
this.selectedCart = selectedCart;
}
}
_
<p:dataTable
id="test_queue" var="c"
value="#{testController.cartQueue}" widgetVar="testTable"
emptyMessage="Pas de file d'attente"
filteredValue="#{testController.filteredCartQueue}"
paginator="true"
currentPageReportTemplate="Nb Rows : {totalRecords}"
paginatorTemplate="{CurrentPageReport}"
>
<p:column id="number_column"
filterBy="#{c}"
headerText="Number"
filterMatchMode="exact"
>
<f:facet name="filter" >
<p:selectOneMenu onchange="PF('testTable').filter()" >
<f:selectItem itemLabel="Nothing" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{testController.nameBumperOptionsString}" />
</p:selectOneMenu>
</f:facet>
<center>
<h:outputText value="#{c}" />
</center>
</p:column>
<p:column headerText="Remove">
<center>
<p:commandButton
action="#{testController.remove()}"
value="Remove"
update="test_queue" >
<f:setPropertyActionListener value="#{c}" target="#{testController.selectedCart}" />
</p:commandButton>
</center>
</p:column>
</p:dataTable>
--
编辑 3:库:
你的代码看起来不错,对我来说也很好用。我无法重现您的问题,因此无法查明真正的根本原因。
您的具体问题很可能是由于具有一堆 servletcontainer 特定库 (never do that!) 的脏运行时类路径和严重过时的 JSF 实现(超过 5 年)引起的。事实上,当您清理运行时类路径并升级 JSF 实现时,它对您来说也能正常工作。
我正在将我的 Web 应用程序更新到 PF5.1(之前是 PF4.0)
<p:dataTable>
组件的简单更新现在完全破坏了我的数据表 FILTER。
update=":#{p:component('tbl_queue')}"
由于新的 PF5.1 版本,我不得不更改我的列过滤器,所以我修改了我的过滤器:
<f:facet name="filter" >
<p:selectOneMenu ... >
<f:selectItem ... />
<f:selectItems ... />
</p:selectOneMenu>
</f:facet>
旧的过滤器版本是:
<p:column id="..."
filterBy=...
filterOptions="..."
filterMatchMode="exact"
>
...
</p:column>
编辑:我的要求很简单,就是通过选择对过滤后的数据表进行删除(并使过滤器保持活动状态)。 PF4.0 可以,PF5 好像不行。
像那样:
第 1 步:过滤数据表
第 2 步:通过单击删除一行 'Envoyer' = 删除 (J91GT N9 03:17:00)
它在 PF4 上运行良好,但我找不到在 PF5 上执行相同操作的解决方案。 编辑 2:
<p:dataTable id="tbl_queue" var="c"
value="#{queueModificationController.cartQueue}"
widgetVar="queueTable"
filteredValue="#{queueModificationController.filteredCartQueue}"
rowKey = "#{c.id}"
>
<p:column
id="Bumper_column"
filterBy="#{c.name_bumper}"
headerText="Bumper"
filterMatchMode="exact"
>
<f:facet name="filter" >
<p:selectOneMenu onchange="PF('queueTable').filter()" id="selectFilterBumper" >
<f:selectItem itemLabel="Aucun" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{queueModificationController.nameBumperOptionsString}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{c.name_bumper}" />
</p:column>
<p:column>
//...
</p:column>
//...
//...
<p:column id="validation_column"
headerText="Validation">
<p:commandButton
action="#{productionQueue.updateAfterSending()}"
value="Validation"
update=":#{p:component('tbl_queue')}"
<f:setPropertyActionListener value="#{c}"
target="#{productionQueue.selectedCart}" />
</p:commandButton>
</p:column>
</p:dataTable>
--
@ManagedBean(name = "productionQueue")
@SessionScoped
private ArrayList<CartInQueueConsult> cartQueue; //filled by Database in bean initialisation
private ArrayList<CartInQueueConsult> filteredCartQueue = new ArrayList<CartInQueueConsult>(cartQueue);
public void updateAfterSending()
{
... (remove in database)
filteredCartQueue.remove(selectedCart);
cartQueue.remove(selectedCart);
}
编辑:MCVE 错误示例:
错误: - 1:过滤器不工作(奇怪的是因为我所有的过滤器都在无 MVCE 示例中正常工作 - 2:当您使用按钮 "Remove" 删除一行时,过滤器被破坏(我最初的问题)
import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
@ManagedBean(name = "testController")
@ViewScoped
public class TestController implements Serializable
{
private ArrayList<String> cartQueue;
private String selectedCart;
private ArrayList<String> filteredCartQueue;
private SelectItem nameBumperOptionsString[] = {new SelectItem(1,"1"),new SelectItem(2,"2"),new SelectItem(3,"3"),new SelectItem(4,"4"),new SelectItem(5,"5")};
@PostConstruct
public void initialize()
{
cartQueue = new ArrayList<String>();
cartQueue.add("1");
cartQueue.add("2");
cartQueue.add("3");
cartQueue.add("4");
cartQueue.add("5");
cartQueue.add("6");
filteredCartQueue = cartQueue;
}
public void remove()
{
try
{
filteredCartQueue.remove(selectedCart);
cartQueue.remove(selectedCart);
}
catch (Exception ex)
{
System.out.println("EXCEPTION : "+ ex.getMessage());
}
}
public ArrayList<String> getFilteredCartQueue() {
return filteredCartQueue;
}
public void setFilteredCartQueue(ArrayList<String> filteredCartQueue) {
this.filteredCartQueue = filteredCartQueue;
}
public SelectItem[] getNameBumperOptionsString() {
return nameBumperOptionsString;
}
public void setNameBumperOptionsString(SelectItem nameBumperOptionsString[]) {
this.nameBumperOptionsString = nameBumperOptionsString;
}
public ArrayList<String> getCartQueue() {
return cartQueue;
}
public void setCartQueue(ArrayList<String> cartQueue) {
this.cartQueue = cartQueue;
}
public String getSelectedCart() {
return selectedCart;
}
public void setSelectedCart(String selectedCart) {
this.selectedCart = selectedCart;
}
}
_
<p:dataTable
id="test_queue" var="c"
value="#{testController.cartQueue}" widgetVar="testTable"
emptyMessage="Pas de file d'attente"
filteredValue="#{testController.filteredCartQueue}"
paginator="true"
currentPageReportTemplate="Nb Rows : {totalRecords}"
paginatorTemplate="{CurrentPageReport}"
>
<p:column id="number_column"
filterBy="#{c}"
headerText="Number"
filterMatchMode="exact"
>
<f:facet name="filter" >
<p:selectOneMenu onchange="PF('testTable').filter()" >
<f:selectItem itemLabel="Nothing" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{testController.nameBumperOptionsString}" />
</p:selectOneMenu>
</f:facet>
<center>
<h:outputText value="#{c}" />
</center>
</p:column>
<p:column headerText="Remove">
<center>
<p:commandButton
action="#{testController.remove()}"
value="Remove"
update="test_queue" >
<f:setPropertyActionListener value="#{c}" target="#{testController.selectedCart}" />
</p:commandButton>
</center>
</p:column>
</p:dataTable>
--
编辑 3:库:
你的代码看起来不错,对我来说也很好用。我无法重现您的问题,因此无法查明真正的根本原因。
您的具体问题很可能是由于具有一堆 servletcontainer 特定库 (never do that!) 的脏运行时类路径和严重过时的 JSF 实现(超过 5 年)引起的。事实上,当您清理运行时类路径并升级 JSF 实现时,它对您来说也能正常工作。