0

我试图像在 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 秒

欢迎提出任何建议!

4

0 回答 0