【问题标题】:Filter Datatable from Backing Bean jsf-primefaces从支持 Bean jsf-primefaces 过滤数据表
【发布时间】:2014-01-25 15:36:02
【问题描述】:

我有一个 primefaces 数据表,并且我有一个带有过滤器的列。我想在支持 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,但没有帮助。

我只需要在单击按钮时在数据表列上设置一个过滤器。 提前致谢

【问题讨论】:

  • 看看this implementationsetFilterParams 的实现看起来很有趣。我现在无法亲自检查它

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

DataTable 过滤器输入中的值在 FacesContext 请求参数映射中发送,并由 DataTableRenderer 在渲染 DataTable 时获取(请参阅PF 3.5PF 4.0 或 @ 的 encodeFilter 方法987654323@)

因此,如果您的按钮与 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]
}

如果您使用多个过滤器,您可以为 filterValues 使用 Map。


或者,如果您需要将用户重定向到新页面,您可以将值放在 URL 中,而不是使用 filterValue。示例:

https://example.com/app/pageOfTheTable.xhtml?form:dataTable:colum:filter=new%20value

form:dataTable:colum:filter 部分是过滤器输入的 ID。您可以通过使用浏览器检查元素来获得它。原理是一样的:你使用的是请求参数映射。


当用户键入内容时更新支持 bean 的值可能很有用。我找到了patch here

它基本上改变了FilterFeature类中的populateFilterParameterMap方法,所以它设置了filterValue的值。您可以将添加的行放在for 循环的末尾。

for ( ... ){
    [...]

+   ValueExpression filterValueVE = column.getValueExpression("filterValue");
+   if (filterValueVE == null) {
+       ((UIComponent)column).getAttributes().put("filterValue", filterValue);
+   } else {
+       filterValueVE.setValue(context.getELContext(), filterValue);
+   }
}

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多