【问题标题】:Filter p:datatable by boolean column (checkbox)按布尔列过滤 p:datatable(复选框)
【发布时间】:2019-12-06 20:19:37
【问题描述】:

我正在尝试使用复选框过滤器通过布尔列过滤我的 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

【问题讨论】:

  • 您确定需要两次PF('mydatatable').filter(); 吗?在 onchance 和点击 ajax 中?
  • 你说得对,其实这两个地方都放filter()好像是多余的,会不会有什么副作用?
  • 否(但我不会使用 ajax...)更新表单也可能会导致奇怪的行为
  • 其实我在想.. 将 ajax 事件的完整方法上的表格过滤为最后一个事件发生不是更明智吗?
  • 在选择上执行 ajax 并不好(它甚至可能是不确定的)。如果您需要更新数据表以外的其他内容(并将其排除在外,例如不是围绕数据表的表单),请将 ajax 过滤器事件添加到数据表并对其进行更新。

标签: jsf primefaces datatable


【解决方案1】:

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

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

【讨论】:

  • 太棒了!添加converter 成功了!将此发布到您对社区的回答中:) &lt;p:column filterBy="#{myBean.myBoolean}" filterMatchMode="in"&gt; &lt;f:facet name="filter"&gt; &lt;p:selectCheckboxMenu label="BooleanFilter" onchange="PF('mydatatable').filter()" styleClass="custom-filter"&gt; &lt;f:converter converterId="javax.faces.Boolean" /&gt; &lt;f:selectItems value="#{myBean.possibleAnswers}" /&gt; &lt;p:ajax update="@form" oncomplete="PF('mydatatable').filter();"/&gt; &lt;/p:selectCheckboxMenu&gt; &lt;/f:facet&gt; &lt;/p:column&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2019-12-07
  • 2016-09-16
  • 2016-12-31
相关资源
最近更新 更多