原理selectCheckboxMenu过滤器不能正常工作,而selectOneMenu在datatable内 [英] Primefaces selectCheckboxMenu filter doesn't work while selectOneMenu well inside datatable

查看:371
本文介绍了原理selectCheckboxMenu过滤器不能正常工作,而selectOneMenu在datatable内的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Primefaces(5.0)datatable。我使用两个列过滤器:selectOneMenu(Filter1)和selectCheckboxMenu(Filter2)。



两个过滤器的数据都被正确填充。 selectOneMenu(Filter1)可以过滤DataTable,但是selectCheckboxMenu(Filter2)在选择一个值后没有找到任何数据。



JSF

 < p:dataTable value =#{employeeBean.employees}var =employeeid =employeeDTable
emptyMessage =No datafilteredValue =#{employeeBean.filteredEmployees}
widgetVar =empWidgetVarrowKey =#{employee.id}>

<! - 这个工作 - >
< p:column headerText =Filter1filterBy =truck.idfilterMatchMode =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>

<! - 这不工作(没有找到任何数据) - >
< p:column headerText =Filter2filterBy =truck.idfilterMatchMode =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





Rendered Filter1





呈现Filter2





为什么selectCheckboxMenu(Filter2)在selectOneMenu中找不到任何数据(Filter1)用相同的数据找到好吗?

解决方案

我知道这可能是一个旧问题,但是我一直在努力使用selectCheckboxMenu Filter几天,找到一个解决方案。
首先,您需要在代码中执行以下操作才能使此过滤器工作:




  • filterBy设置为您在outputText中显示的确切值

  • String []将您选择的过滤器值存储在bean中的值

  • 捕获更改并选择所有复选框事件使用ajax并触发PrimeFaces过滤器函数

  • 在bean中绑定一个侦听器,以处理由selectCheckboxMenu

  • 触发的过滤器事件,以避免javascript版本,只需将您的表ID和widgetVar设置为相同的值(在我们的示例TABLEID中)

  • 在您的UI组件中设置ID,并找出此列的索引在数据表中。最好将这两个设置为控制器或演示者中的常量

     < p:column id =columnLicensesheaderText = Filter2filterBy =employee.truck.licensefilterMatchMode =in> 
    < f:facet name =filter>
    < p:selectCheckboxMenu value =#{employeeBean.selectedTrucks}label =Vrachtwagen>
    < f:selectItems value =#{dropdowns.trucksWithAllOption}/>
    < p:ajax event =changeprocess =@ thisupdate =:FORMIDlistener =#{employeeBean.onFilter()}oncomplete =PF('TABLEID' )/>
    < p:ajax event =toggleSelectprocess =@ thisupdate =:FORMIDlistener =#{employeeBean.onFilter()}oncomplete =PF('TABLEID' )/>
    < / p:selectCheckboxMenu>
    < / f:facet>
    < h:outputText value =#{employee.truck.license}/>




在你的bean中,你需要实现监听器。还需要实现将实际的FilterMeta对象加载到属于datatable对象的FilterMetadata对象中的方法。由于PrimeFaces不会传递String数组选择值过滤器的良好值,所以我们基本上会将该数组连接到我们的bean中,然后将其转换为PrimeFaces未提供的FilterMeta对象。所以添加以下代码到你的bean:

  private static final String TABLE_ID =TABLEID; 
private static final String COLUMN_ID_LICENSES =columnLicenses;
private static final int COLUMN_INDEX_LICENSES = 2; //例如,它是表中的第三列
private String [] selectedTrucks; //为这个

生成getter和setter 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){
(UIColumn列: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);
}
}
}
}


I have a Primefaces(5.0) datatable. I use two column filters: selectOneMenu(Filter1) and 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

Rendered Filter1

Rendered Filter2

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

解决方案

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 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}"/>
    

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);
            }
        }
    }
}

这篇关于原理selectCheckboxMenu过滤器不能正常工作,而selectOneMenu在datatable内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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