0

我有以下问题。我创建了一个 TagLibrary,它列出了给定的集合,如果数据如下

    class LisTagLib {

        static final CONTEXT = this.class.name
        /**
         * Current data from collection
         */
        def currentData;
        String columnHeaders = "";
        List writtenHeaders = [];

        // draw main table
        Closure listTable = { attrs, body ->

            def writer = getOut()

            writer << "<table>";
            writer << "<thead>"
            writer << "<tr>"
            writer << columnHeaders
            writer << "</tr>"
            writer << "</thead>"
            writer << "<tbody>"

            if(attrs.source){
                attrs.source.each() { value ->
                    writer << "<tr>";
                    writer << body()
                    writer << "</tr>";
                }
            }

            // output the body
            writer << "</tbody>";
            writer << "</table>";
        } 
.
.
.
}

我的问题是每次调用此标记库时都没有创建“columnHeaders”属性。如果我在第 X 页然后在第 Y 页中调用它,则第 Y 页的标题也称为“第 X 页中显示的标题 + 第 Y 页中显示的标题”。我尝试了构造函数,但是这个类在编译时只构造一次。有什么解决方案。每次调用此标记库时如何重置这些值?顺便说一下

columnHeaders = "";

在 listTable 闭包的开头或结尾删除所有 columnHeaders 并且不打印任何标题。

4

1 回答 1

3

Taglibs 是单例的,所以类范围的字段,如currentData,columnHeaderswrittenHeaders由所有请求共享。Spring bean 默认为单例,在 Grails 中就是这种情况,但控制器是按请求创建的并且可以具有状态(但不应该)。

解决方法是将这些字段作为变量移动到您的标签正文中,并在需要时将它们作为参数传递给辅助方法,而不是将它们称为类字段。

ps 去掉分号 :)

于 2012-10-03T18:41:37.440 回答