Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从支持Bean jsf primefaces筛选Datatable_Jsf_Jsf 2_Primefaces_Datatable - Fatal编程技术网

从支持Bean jsf primefaces筛选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

我有一个primefaces数据表,还有一个带有过滤器的列。我想对来自支持bean的列应用过滤器

我遵循了这一点,我能够将给定的过滤器文本框输入到我的bean中

但是当我使用setFilter时,这些值是在HashMap中设置的,但是filter并没有应用于datatable

示例列

<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);
+   }
}