我正在尝试使用复选框过滤器通过布尔列过滤我的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 变量是已在init
的{{1}}方法中使用myBean
&& true
值初始化的列表
false
我的数据表中有带有文本值的类似工作示例,并且运行良好。当然,我可以通过将 @PostConstruct
public void init(){
this.possibleAnswers= new ArrayList<>();
possibleAnswers.add(true);
possibleAnswers.add(false);
}
(true / false)的值转换为boolean
(“ true” /“ false”)(甚至编写自定义函数来检查是否相等),但是我不太喜欢这种解决方案,我更喜欢其他任何开箱即用的解决方案(也许是其他String
吗?)。
我正在使用primefaces 7.0
答案 0 :(得分:1)
通常,输入组件具有“值”属性,该属性绑定到备用Bean中的字段(getter / setter)。该字段的类型可用于将http请求的技术字符串自动转换为正确的java类型。对于数据表过滤器,由于没有值属性,因此无法自动完成。向所有组件提供有关可以使用它们的所有可能容器的知识是错误的设计。因此,唯一且正确的解决方案是使用显式转换器。
看看PrimeFaces datatable filter showcase中Status-Column的实现,据我所知正是您所需要的
供参考:
<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>