我试图像在 Excel 中一样在 Grails 自动过滤器中实现。我的想法是创建一个 Taglib
class FilterPanelTagLib {
static namespace = 'x'
def filterPanel = {attrs, body ->
StringBuffer content = new StringBuffer()
List lines = attrs.lines
def filter = attrs.filter
out << "<form>"
long start = System.currentTimeMillis()
attrs.columns.each{col->
if(col != ''){
List tmp = getColumnValues(lines,col)
def value = filter?filter[col]:""
out << "<th>" + g.select(
onchange:"submit()",
name:"filter."+col,
from:tmp,
value:value,
noSelection:['ALL':'ALL'])+"</th>"
}else {
out << "<th> </th>"
}
}
out << "</form>"
println ((System.currentTimeMillis()-start)/1000 + " filterPanelTagLib".center(40,"-"))
}
private List getColumnValues(List lines, String column){
List result = lines.collect{it[column]}.unique().sort() << 'ALL'
return result
}
并像这样在 GSP 中使用它:
<x:filterPanel filter="${filter}" lines="${taskList}" columns="['id',
'label',
'activity',
'assignee'
'',
'']"/>
它工作正常。我在控制器中将所选保管箱的值作为 params.filter 获取,并且可以使用 criteriaBuilder 来获取过滤后的列表。
问题是创建每个下拉列表内容的性能。我已经测试了一个包含 1000 个项目的列表,大约需要 3 秒。30.000 的目标性能为 <2 秒
欢迎提出任何建议!