我使用primefaces datatable在UI中显示我的数据。我们都知道。,我们可以在数据表本身中进行排序和过滤。但是当我在datatable排序字段中输入单个字符时,它开始搜索数据,我不想要它。只有当用户在字段中输入至少3个字符时,我需要搜索数据。这可能吗?如果是这样的话。以什么方式?请给出你的意见。
我对Primefaces的数据表做了一个小调查,下面是我的发现。
实际上,重新编译是没有必要的,源javascript替换也是如此。
您需要为过滤器事件注册一个新的处理程序,而不是Primefaces提供的处理程序。
在这种情况下,数据表将像这样使用:
<h:outputScript name="js/customprimefacestable.js" target="body"/>
<p:dataTable var="data" value="#{filterBean.data}" filteredValue="#{filterBean.filteredData}" widgetVar="tableWidget">
<p:column filterBy="#{data.name}" headerText="Name" filterMatchMode="contains">
<h:outputText value="#{data.name}" />
</p:column>
<p:column filterBy="#{data.value}" headerText="Value" filterMatchMode="contains">
<h:outputText value="#{data.value}" />
</p:column>
...
</p:dataTable>
javascript将是这样的:
$(document).ready(function() {
tableWidget.thead.find('> tr > th.ui-filter-column > .ui-column-filter').each(function() {
var filter = $(this);
if(filter.is('input:text')) {
if(tableWidget.cfg.filterEvent!="enter"){
//unbind current handler
filter.unbind(tableWidget.cfg.filterEvent);
//bind new handler that accounts for conditional filtering
filter.bind(tableWidget.cfg.filterEvent, function(c) {
if(filter.val().length > 3) {
//Primefaces 3.5 implementation
if(tableWidget.filterTimeout){
clearTimeout(tableWidget.filterTimeout);
}
tableWidget.filterTimeout=setTimeout(function(){
tableWidget.filter();
tableWidget.filterTimeout=null},
tableWidget.cfg.filterDelay);
}
});
}
}
});
});
注意事项:
-
target="body"
: javascript不能在<head>
中执行,因为Primefaces在$(document).ready()
中初始化了它的小部件变量,所以不能保证你的函数在 Primefaces初始化之后执行; - 由于过滤开始时在列的搜索框中输入至少4个字符(已完成),当用户自行删除文本到4个字符以下时,应恢复未过滤的视图(未完成);
- 上面的解决方案是针对Primefaces 3.5
<p:dataTable>
的。Primefaces的实现因版本而异,因此请务必查看您正在使用的版本的实现,或者升级到3.5版本; - 未涵盖将输入字段呈现为下拉框的过滤事件的实现;
- 表将监听默认的(
keyup
)事件。