【发布时间】:2015-05-24 04:07:00
【问题描述】:
我正在将我的 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 上似乎不行。
像这样:
第一步:过滤数据表
第 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:过滤器不工作(奇怪的事情,因为我所有的过滤器都在 no-MVCE 示例上正常工作 - 2:当您使用“删除”按钮删除一行时,过滤器已损坏(我最初的问题)
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:库:
【问题讨论】:
-
您的问题令人困惑。乍一看,您似乎已经解决了问题,只是在问为什么 PrimeFaces 人决定从方法 X 更改为方法 Y。如果您真的这样问,您应该直接问 PrimeFaces 人。如果不是,请重新提出您的问题以询问实际的技术问题。
-
这是真的,很抱歉造成混乱。我已经编辑了问题。
-
代码不完整,因此很难确定确切原因(MCVE 会有所帮助),但如果您在
@ViewScopedbean 上设置了<p:dataTable filteredValue>,这应该可以工作属性和删除操作方法返回null或void。 -
莫哈拉 2.0.1?真的吗?这是超过 5 年和 bug 缠身。目前已经是 2.1.29。试一试。此外,JSF 2.2 甚至应该适用于您的配置。
-
库确实是一团糟.. Servletcontainer 特定库不属于 webapp 的
/WEB-INF/lib。您应该至少从/WEB-INF/lib中删除javaee-*JAR 和所有已经存在于Servletcontainer(在您的情况下是Tomcat)自己的/lib文件夹中的JAR,例如catalina-*、tomcat-*、jasper-*、servlet-*、jsp-*和el-*。我自己在我的测试项目中只有 JSF、JSTL 和 PrimeFaces 库。
标签: jsf jsf-2 primefaces filter datatable