我有一个primefaces数据表,我有一个带filter.i的列。我想在后备bean的列上应用过滤器。
我遵循了这个example,我能够将输入过滤器文本框输入到我的bean中。
但是当我使用setFilter时,在HashMap中设置了值,但是没有在数据表上应用过滤器。
示例列
<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);
这会设置值,但数据表没有变化。
我试过this,但没有帮助。
我需要的是在点击按钮时在数据表列上设置过滤器。 提前致谢
答案 0 :(得分:1)
DataTable过滤器的输入中的值在FacesContext请求参数映射中发送,并在DataTableRenderer呈现DataTable时获取(请参阅PF 3.5的encodeFilter
方法,{{ 3}},或PF 4.0)
因此,如果您的按钮与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>
然后,您可以更改bean中的filterValue
:
@Named
@SessionScoped
public SomeBean implements Serializable {
private String filterValue;
[...]
public void action() {
filterValue = "new value";
}
[getters/setters]
}
如果使用许多过滤器,可以使用map作为filterValues。
作为替代方案,如果您需要将用户重定向到新页面,则可以将值放在网址中,而不是使用filterValue
。例如:
https://example.com/app/pageOfTheTable.xhtml?form:dataTable:colum:filter=new%20value
部分form:dataTable:colum:filter
是过滤器输入的ID。您可以通过使用浏览器检查元素来实现。原理是一样的:您正在使用请求参数映射。
当用户键入内容时更新辅助bean的值可能很有用。我找到了PF 6.1。
它基本上改变了populateFilterParameterMap
类中的FilterFeature
方法,因此它设置了filterValue
的值。您可以将添加的行添加到for
循环的末尾。
for ( ... ){
[...]
+ ValueExpression filterValueVE = column.getValueExpression("filterValue");
+ if (filterValueVE == null) {
+ ((UIComponent)column).getAttributes().put("filterValue", filterValue);
+ } else {
+ filterValueVE.setValue(context.getELContext(), filterValue);
+ }
}