我知道这很奇怪,但我试图在taglib中提供一个pass through接口,允许调用者传入任何其他标记,以便在容器中显示并进行额外处理。
为此,我尝试动态调用任意命名空间中的任意标记。这可能更清楚。
GSP:
<myLib:myTag someProp="blah" anotherProp="blah2" size="80" namespace="g" tag="textField">
在我的taglib中,我试图显示他们传递的标记。
标签库:
def myTag = {
String id = //some processing, not specified by caller
attrs.put("id", id)
def namespace = attrs.remove("namespace")
def tag = attrs.remove("tag")
out << ?????
}
问题出现在外面......我在调用标签时遇到问题。我已经尝试了以下错误
namespace.tag(attrs) //No signature of method: java.lang.String.tag()
namespace."${tag}"(attrs) //No signature of method: java.lang.String.textField()
"${namespace}"."${tag}"(attrs) //No signature of method: java.lang.String.textField()
这似乎有效,但该方法需要支持其他命名空间中的标记
g."${tag}"(attrs)
所以问题是如何使用反射来使用动态定义的taglib?
我没有让它们在body()中传递完全形成的标记,因为我需要在taglib中与它进行交互。
答案 0 :(得分:0)
我相信以下工作,我不完全确定这是最好的答案,因此会将问题留给其他人提出建议。
String namespace = attrs.remove("namespace")
String tag = attrs.remove("tag")
GrailsTagLibClass tagLibClass = grailsApplication.getTagLibClasses().find { it.namespace == namespace && it.hasTag(tag)}
def tagLibBean = grailsApplication.mainContext.getBean(tagLibClass.getFullName())
out << tagLibBean."${tag}"(attrs)