Grails taglib重置属性

时间:2012-10-03 18:11:34

标签: grails taglib

我有以下问题。我创建了一个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>";
        } 
.
.
.
}

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

这样的东西
columnHeaders = "";

在listTable闭包的开头或末尾删除all columnHeaders并且不打印标题。

1 个答案:

答案 0 :(得分:3)

Taglib是单例,因此所有请求都会共享currentDatacolumnHeaderswrittenHeaders等类范围字段。 Spring bean默认为单例,Grails就是这种情况,除了每个请求创建的控制器,并且可以有状态(但不应该)。

修复方法是将这些字段作为变量移动到标记主体中,并在需要时将它们作为参数传递给辅助方法,而不是将它们称为类字段。

P.S。丢失分号:)