我有一个动态数据表,并希望根据列显示不同的过滤器类型,但似乎我只能在一个过滤器方面内一次使用一个对象。如果我尝试使用多个输入类型,我会得到一个
java.lang.ClassCastException: javax.faces.component.UIPanel cannot be cast to javax.faces.component.ValueHolder
我当前的(不工作的)代码是这样的:
<f:facet name="filter">
<p:inputText onkeyup="PF('myTable').filter()" rendered="#{column.filterType=='TEXT'}" />
<p:selectOneMenu onchange="PF('myTable').filter()" rendered="#{column.filterType=='LIST'}">
<f:selectItems value="#{column.filterMap}" />
</p:selectOneMenu>
</f:facet>
inputText和selectOneMenus正确显示,但由于ClassCast Exception,我无法过滤我的表。如果我只使用其中一种输入类型,过滤将按预期工作。
是否有可能有条件地显示不同的筛选facet或facet内的输入类型?
我发现的唯一"解决方案"是始终使用selectOneMenus并使它们可编辑,如果过滤器类型为"TEXT"
<p:selectOneMenu onchange="PF('myTable').filter()" editable="#{column.filterType=='TEXT'}" styleClass="#{column.filterType}">
根据你的第二个评论,我测试了这个代码,它的工作;其思想是过滤器依赖于列,因此:
<p:column filterBy="#{column.attribute}" filterMatchMode="contains" rendered="#{column.filterType=='TEXT'}" >
<f:facet name="filter">
<p:inputText onkeyup="PF('myTable').filter()" />
</f:facet>
</p:column>
<p:column filterBy="#{column.attribute}" filterMatchMode="equals" rendered="#{column.filterType=='LIST'}">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('myTable').filter()" >
<f:selectItems value="#{column.filterMap}" />
</p:selectOneMenu>
</f:facet>
</p:column>
显示和隐藏列,而不是过滤器。
注:inputttext的过滤模式为contains AND,对于List的过滤模式为Equals