按布尔列(复选框)过滤 p:datatable

Filter p:datatable by boolean column (checkbox)

我正在尝试使用复选框过滤器按布尔列过滤我的 primefaces 数据表,但不幸的是,在 primefaces 数据表中过滤似乎不适用于 String 以外的任何类型,但应该有一个解决方法这个案例。

数据表列

<p:column headerText="A_boolean_column" filterBy="#{myBean.myBoolean}"  filterMatchMode="exact">
  <f:facet name="filter">
     <p:selectCheckboxMenu label="BooleanFilter" onchange="PF('mydatatable').filter()" styleClass="custom-filter">
       <f:selectItems value="#{myBean.possibleAnswers}" />
       <p:ajax update="@form" oncomplete="PF('mydatatable').filter();"/>
    </p:selectCheckboxMenu>
  </f:facet>
     <h:outputText value="#{myBean.myBoolean}"/>
</p:column>

其中 possibleAnswers 变量是已在 myBeaninit 方法中使用 true && false 初始化的列表值

      @PostConstruct
      public void init(){
        this.possibleAnswers= new ArrayList<>();
        possibleAnswers.add(true);
        possibleAnswers.add(false);
      }

我的数据表中有类似的工作示例,其中包含文本值,并且运行良好。当然,我可以通过将值从 boolean(true/false)转换为 String("true"/"false")(甚至 写一个自定义函数来检查相等性),但我不太喜欢这个解决方案,我更喜欢任何其他开箱即用的解决方案(也许是不同的filterMatchMode?)。

我正在使用 primefaces 7.0

通常,输入组件有一个 'value' 属性,该属性绑定到支持 bean 中的字段 (getter/setter)。该字段的类型可用于将http请求的技术字符串自动转换为正确的java类型。对于数据表过滤器,这不能自动完成,因为没有值属性。向所有组件提供有关它们可以在其中使用的所有可能容器的知识是糟糕的设计。所以唯一正确的解决方案是使用显式转换器。

查看 PrimeFaces datatable filter showcase 中状态列的实现,据我所知,这正是您所需要的

供参考:

<p:column filterBy="#{myBean.myBoolean}" filterMatchMode="in">
   <f:facet name="filter"> 
      <p:selectCheckboxMenu label="BooleanFilter" 
         onchange="PF('mydatatable').filter()" styleClass="custom-filter"> 
         <f:converter converterId="javax.faces.Boolean" /> 
         <f:selectItems value="#{myBean.possibleAnswers}" /> 
         <p:ajax update="@form" oncomplete="PF('mydatatable').filter();"/> 
      </p:selectCheckboxMenu> 
   </f:facet> 
</p:column>