gpt4 book ai didi

jsf - Primefaces selectCheckboxMenu 过滤器在 selectOneMenu 位于数据表内时不​​起作用

转载 作者:行者123 更新时间:2023-12-04 18:42:07 26 4
gpt4 key购买 nike

我有一个 Primefaces(5.0) 数据表。我使用两列过滤器:selectOneMenu(Filter1) 和 selectCheckboxMenu(Filter2)。
两个过滤器的数据都被很好地填充。 selectOneMenu(Filter1) 可以过滤DataTable,但是selectCheckboxMenu(Filter2) 选择一个值后没有找到任何数据。
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
enter image description here
渲染过滤器1
enter image description here
渲染过滤器2
enter image description here
为什么 selectCheckboxMenu(Filter2) 找不到任何数据,而 selectOneMenu(Filter1) 可以很好地找到相同的数据?

最佳答案

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

  • filterBy 设置为您在 outputText
  • 中显示的确切值
  • String[] 值将您选择的过滤器值存储在您的 bean
  • 使用 ajax 捕获更改和 selectAll 复选框事件并触发 PrimeFaces 过滤器功能
  • 在您的 bean 中绑定(bind)一个监听器以在 selectCheckboxMenu
  • 触发时处理过滤器事件
  • 为避免 javascript 版本出现问题,只需将表 ID 和 widgetVar 设置为相同的值(在我们的示例中为“TABLEID”)
  • 在您的 UI 组件中设置 ID 并找出该列在数据表中的索引。最好将这两个设置为您的 Controller 或演示器中的常量
    <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:
    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);
    }
    }
    }
    }

    关于jsf - Primefaces selectCheckboxMenu 过滤器在 selectOneMenu 位于数据表内时不​​起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745238/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com