我试图像在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'
'',
'']"/>
工作正常。我在控制器中将选定的dropbox的值作为params.filter获取,并且可以使用criteriaBuilder来获取已过滤的列表。
问题是创建每个下拉列表内容的性能。我已经测试了1000个项目的列表,大约需要3秒。对于30.000
,目标性能<2秒任何建议都很好!