grails调用动态标记



我知道这很奇怪,但我正试图在标签库中提供一个传递接口,允许调用方传递任何其他标签,以便在容器中显示,并进行额外处理。

为此,我尝试在任意名称空间中动态调用任意标记。举例来说,这一点可能会更清楚。

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中与它交互。

我相信下面的方法是有效的,我不完全确定这是最好的答案,所以这个问题有待其他人的建议。

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)

最新更新