Jsf 过滤器p:按布尔列列出的数据表(复选框)

Jsf 过滤器p:按布尔列列出的数据表(复选框),jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我试图使用复选框过滤器通过布尔列筛选primefaces数据表,但不幸的是,primefaces数据表中的筛选似乎不适用于除字符串以外的任何类型,但这种情况下应该有一个解决方法 数据表列 <p:column headerText="A_boolean_column" filterBy="#{myBean.myBoolean}" filterMatchMode="exact"> <f:facet name="filter"> <p:selectChec

我试图使用复选框过滤器通过布尔列筛选primefaces数据表,但不幸的是,primefaces数据表中的筛选似乎不适用于除
字符串
以外的任何类型,但这种情况下应该有一个解决方法

数据表列

<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>
在我的datatable中,我有类似的工作示例,其中包含文本值,并且工作得非常完美。当然,我可以通过将值从
boolean
(true/false)转换为
String
(“true”/“false”)(甚至编写一个自定义函数来检查相等性来解决我的问题,但我并不真正喜欢这个解决方案,我更喜欢其他现成的解决方案(可能是一个不同的
过滤器machmode
?)


我使用的是primefaces 7.0,通常输入组件有一个绑定到字段的“value”属性(getter/setter)在支持bean中。此字段的类型可用于自动将http请求的技术字符串转换为正确的java类型。对于datatable筛选器,这无法自动完成,因为没有值属性。为所有组件提供有关其可用于的所有可能容器的知识是糟糕的设计。因此,只有正确的解决方案是使用显式转换器

请查看中Status列的实现,据我所知,它正是您所需要的

供参考:

<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>


太好了!添加
转换器成功了!将此信息发布到社区的答案中:)
您确定需要
PF('mydatatable')。过滤器()两次?在onchance和ajax-on-click中?你是对的,实际上在这两个地方放置
filter()
似乎是多余的,它可能会导致任何副作用吗?不(但我不会使用ajax…)更新表单可能会导致奇怪的行为实际上我在想。。将ajax事件的完整方法作为最后一个发生的事件来过滤表不是更明智吗?在select上执行ajax是不好的(甚至可能是不确定的)。如果您需要更新datatable以外的内容(并排除它,例如,不是围绕datatable的表单),请向datatable添加ajax筛选器事件并对其进行更新。
<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>