我有以下问题。我创建了一个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中显示的标题”。我尝试了构造函数,但此类在编译时仅构造一次。解决方案是什么?每次调用此标记库时,如何重置这些值?
顺便说一句
columnHeaders = "";
在listTable闭包的开始或结尾处删除所有columnHeaders,并且不打印任何标题。
最佳答案
Taglib是单例,因此所有请求都共享类范围字段(如currentData
,columnHeaders
和writtenHeaders
)。 Spring bean默认为单例,在Grails中就是这种情况,除了 Controller 是根据请求创建的,并且可以具有状态(但不应如此)。
解决方法是将这些字段作为变量移动到标签主体中,并根据需要将它们作为参数传递给辅助方法,而不是将它们称为类字段。
ps。失去分号:)