Primefaces selectCheckboxMenu 过滤器不起作用,而 selectOneMenu 在数据表中很好 [英] Primefaces selectCheckboxMenu filter doesn't work while selectOneMenu well inside datatable

查看:16
本文介绍了Primefaces selectCheckboxMenu 过滤器不起作用,而 selectOneMenu 在数据表中很好的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Primefaces(5.0) 数据表.我使用两列过滤器:selectOneMenu(Filter1) 和 selectCheckboxMenu(Filter2).

I have a Primefaces(5.0) datatable. I use two column filters: selectOneMenu(Filter1) and selectCheckboxMenu(Filter2).

两个过滤器的数据都被很好地填充.selectOneMenu(Filter1) 可以对DataTable 进行过滤,但是selectCheckboxMenu(Filter2) 选择一个值后没有发现任何数据.

Both filter's data are being filled fine. selectOneMenu(Filter1) can filter the DataTable but the selectCheckboxMenu(Filter2) finds no any data after selecting a value.

JSF

<p:dataTable value="#{employeeBean.employees}" var="employee" id="employeeDTable"
    emptyMessage="No data" filteredValue="#{employeeBean.filteredEmployees}"
    widgetVar="empWidgetVar" rowKey="#{employee.id}">
    
    <!-- THIS WORKS -->
    <p:column headerText="Filter1" filterBy="truck.id" filterMatchMode="exact">
        <f:facet name="filter">
            <p:selectOneMenu onchange="PF('empWidgetVar').filter()">
                <f:selectItems value="#{dropdowns.trucksWithAllOption}"/>
            </p:selectOneMenu>
        </f:facet>
        <h:outputText value="#{employee.truck.license}"/>
    </p:column>
    
    <!-- THIS DOESN'T WORK (Doesn't find any data) -->
    <p:column headerText="Filter2" filterBy="truck.id" filterMatchMode="in">
        <f:facet name="filter">
            <p:selectCheckboxMenu onchange="PF('empWidgetVar').filter()" label="Vrachtwagen">
                <f:selectItems value="#{dropdowns.trucksWithAllOption}"/>
            </p:selectCheckboxMenu>
        </f:facet>
        <h:outputText value="#{employee.truck.license}"/>
    </p:column>
    
</p:dataTable>

dropdowns.trucksWithAllOption

渲染过滤器 1

渲染过滤器2

为什么 selectCheckboxMenu(Filter2) 找不到任何数据,而 selectOneMenu(Filter1) 用相同的数据可以找到?

Why selectCheckboxMenu(Filter2) can't find any data while selectOneMenu(Filter1) finds well with the same data?

推荐答案

我知道这可能是一个老问题,但我已经为 selectCheckboxMenu 过滤器苦苦挣扎了好几天,我终于找到了解决方案.首先,你应该在你的代码中做几件事情来让这个过滤器工作:

I know this might be an old question, but I've been struggling with selectCheckboxMenu Filter for days now, and I finally found a solution. First of all, there are several things you should do in your code to get this filter to work:

  • filterBy 设置为您在 outputText 中显示的确切值
  • String[] 值用于在 bean 中存储您选择的过滤器值
  • 使用ajax捕获更改和selectAll复选框事件并触发PrimeFaces过滤器功能
  • 在你的 bean 中绑定一个监听器来处理由 selectCheckboxMenu 触发的过滤器事件
  • 为避免 javascript 版本出现问题,只需将表 ID 和 widgetVar 设置为相同的值(在我们的示例中为TABLEID")
  • 在您的 UI 组件中设置 ID,并在数据表中找出该列的索引.最好将这两个设置为控制器或演示器中的常量

  • filterBy set to the exact value that you are displaying in outputText
  • String[] value to store your selected filter values in your bean
  • catch change and selectAll checkbox events with ajax and trigger the PrimeFaces filter function
  • bind a listener in your bean to handle the filter events when triggered by selectCheckboxMenu
  • to avoid problems with javascript versions, just set both your table ID and widgetVar to the same value (in our example "TABLEID")
  • Set ID in your UI component and figure out the index of this column in the datatable. Best is to set these two as constants in your controller or presenter

<p:column id="columnLicenses" headerText="Filter2" filterBy="employee.truck.license" filterMatchMode="in">
<f:facet name="filter">
    <p:selectCheckboxMenu value="#{employeeBean.selectedTrucks}" label="Vrachtwagen">
        <f:selectItems value="#{dropdowns.trucksWithAllOption}"/>
        <p:ajax event="change" process="@this" update=":FORMID" listener="#{employeeBean.onFilter()}" oncomplete="PF('TABLEID').filter()" />
        <p:ajax event="toggleSelect" process="@this" update=":FORMID" listener="#{employeeBean.onFilter()}" oncomplete="PF('TABLEID').filter()" />
    </p:selectCheckboxMenu>
</f:facet>
<h:outputText value="#{employee.truck.license}"/>

在你的 bean 中,你需要实现监听器.您还需要实现将实际 FilterMeta 对象加载到属于数据表对象的 FilterMetadata 对象中的方法.由于 PrimeFaces 没有通过 String 数组选择值过滤器的好值,我们基本上是要在我们的 bean 中连接这个数组,然后将它转换为 PrimeFaces 没有提供的 FilterMeta 对象.因此,将以下代码添加到您的 bean:

In your bean, you need to implement the listener. Also you need to implement the method that is going to load your actual FilterMeta object into the FilterMetadata object, that belongs to the datatable object. Since PrimeFaces does not pass the good value for String array selection value filter, we are basically going to wire this array in our bean, and then convert it to the FilterMeta object that PrimeFaces did not deliver. So add following code to your bean:

private static final String TABLE_ID = "TABLEID";
private static final String COLUMN_ID_LICENSES = "columnLicenses";
private static final int COLUMN_INDEX_LICENSES = 2; // for example, it is third column in the table
private String [] selectedTrucks; // Also generate getter and setter for this

public void onFilter() {
        DataTable table = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent(TABLE_ID);
        updateCollectionFilterFor(table, COLUMN_ID_LICENSES, selectedTrucks,
                COLUMN_INDEX_LICENSES);
    }

@SuppressWarnings("unchecked")
private void updateCollectionFilterFor(final DataTable table, final String columnId, final String[] filterValue,
        int columnIndex) {
    for (UIColumn column : table.getColumns()) {
        if (column.getClientId().contains(columnId)) {
            ValueExpression columnFilterByVE = column.getValueExpression("filterBy");
            if (null != columnFilterByVE) {
                FilterMeta fm = new FilterMeta(column, columnFilterByVE, filterValue);
                table.getFilterMetadata().remove(columnIndex);
                table.getFilterMetadata().add(columnIndex, fm);
            }
        }
    }
}

这篇关于Primefaces selectCheckboxMenu 过滤器不起作用,而 selectOneMenu 在数据表中很好的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆