Jsf 过滤器p:按布尔列列出的数据表(复选框)
我试图使用复选框过滤器通过布尔列筛选primefaces数据表,但不幸的是,primefaces数据表中的筛选似乎不适用于除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
字符串
以外的任何类型,但这种情况下应该有一个解决方法
数据表列
<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>