从支持Bean jsf primefaces筛选Datatable
我有一个primefaces数据表,还有一个带有过滤器的列。我想对来自支持bean的列应用过滤器 我遵循了这一点,我能够将给定的过滤器文本框输入到我的bean中 但是当我使用setFilter时,这些值是在HashMap中设置的,但是filter并没有应用于datatable 示例列从支持Bean jsf primefaces筛选Datatable,jsf,jsf-2,primefaces,datatable,Jsf,Jsf 2,Primefaces,Datatable,我有一个primefaces数据表,还有一个带有过滤器的列。我想对来自支持bean的列应用过滤器 我遵循了这一点,我能够将给定的过滤器文本框输入到我的bean中 但是当我使用setFilter时,这些值是在HashMap中设置的,但是filter并没有应用于datatable 示例列 <p:column filterBy="#{var.value}" headerText="Example" footerText="contains&quo
<p:column filterBy="#{var.value}" headerText="Example" footerText="contains" filterMatchMode="contains" />
Bean是会话作用域,下面的代码位于一个函数中,该函数在单击按钮时被调用
Map<String,String> theFilterValues = new HashMap<String,String>();
theFilterValues.put("filterColumn","someValue");
myDataTable.setFilters(theFilterValues);
Map theFilterValues=newhashmap();
filtervalues.put(“filterColumn”、“someValue”);
setFilters(filtervalues);
这将设置值,但datatable上没有更改
我试过了,但没用
我只需单击按钮,在datatable列上设置一个过滤器。
提前感谢DataTable筛选器输入中的值在FacesContext请求参数映射中发送,并由DataTableRenderer在呈现DataTable时获得(请参阅encodeFilter方法以了解或) 因此,如果您的按钮与DataTable的形式相同,则过滤器的值将在请求参数映射中发送,渲染器将显示这些值,而不是您想要的任何其他值 您需要将按钮设置为单独的形式:
<h:form>
<p:commandButton action="#{someBean.action()}" update="@([id$=dataTable])" />
</h:form>
<h:form>
<p:dataTable id="dataTable" [...] >
<p:column filterBy="#{var.col}" filterValue="#{someBean.filterValue}">
<h:outputText value="#{var.col}">
</p:column>
</p:dataTable>
</h:form>
如果要使用多个过滤器,则可以使用FilterValue的映射
或者,如果需要将用户重定向到新页面,可以将值放在URL中,而不是使用
filterValue
。例如:
https://example.com/app/pageOfTheTable.xhtml?form:dataTable:colum:filter=new%20value
部分form:dataTable:coln:filter
是过滤器输入的ID。您可以通过使用浏览器检查图元来实现这一点。原理是一样的:您使用的是请求参数映射
当用户键入某些内容时,更新支持bean的值可能很有用。我找到了一个新的工作 它基本上改变了
FilterParameterMap
方法,在FilterFeature
类中,因此它设置了filterValue
的值。您可以将添加的行放在for
循环的末尾
for ( ... ){
[...]
+ ValueExpression filterValueVE = column.getValueExpression("filterValue");
+ if (filterValueVE == null) {
+ ((UIComponent)column).getAttributes().put("filterValue", filterValue);
+ } else {
+ filterValueVE.setValue(context.getELContext(), filterValue);
+ }
}
看看setFilterParams
的实现看起来很有趣。我只是现在不能亲自检查一下
for ( ... ){
[...]
+ ValueExpression filterValueVE = column.getValueExpression("filterValue");
+ if (filterValueVE == null) {
+ ((UIComponent)column).getAttributes().put("filterValue", filterValue);
+ } else {
+ filterValueVE.setValue(context.getELContext(), filterValue);
+ }
}