从Backing Bean jsf-primefaces过滤数据表

时间:2014-01-07 19:43:15

标签: jsf jsf-2 primefaces datatable

我有一个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,但没有帮助。

我需要的是在点击按钮时在数据表列上设置过滤器。 提前致谢

1 个答案:

答案 0 :(得分:1)

DataTable过滤器的输入中的值在FacesContext请求参数映射中发送,并在DataTableRenderer呈现DataTable时获取(请参阅PF 3.5encodeFilter方法,{{ 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);
+   }
}