【问题标题】:PrimeFaces 5.1 p:datatable filter is destroyed by update datatablePrimeFaces 5.1 p:数据表过滤器被更新数据表破坏
【发布时间】: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 会有所帮助),但如果您在 @ViewScoped bean 上设置了 &lt;p:dataTable filteredValue&gt;,这应该可以工作属性和删除操作方法返回nullvoid
  • 莫哈拉 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


【解决方案1】:

您的代码看起来不错,对我来说也很好用。我永远无法重现您的问题,因此我无法查明真正的根本原因。

您的具体问题很可能是由带有一堆 servletcontainer 特定库 (never do that!) 的脏运行时类路径和严重过时的 JSF 实现(超过 5 年)引起的。事实上,当您清理运行时类路径并升级 JSF 实现时,它对您也很有效。

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 2014-01-04
    • 1970-01-01
    • 2013-07-30
    • 2014-03-01
    • 1970-01-01
    • 2013-08-01
    • 2012-11-01
    • 2015-03-04
    相关资源
    最近更新 更多