Grails标签不解析其身体中的变量

时间:2011-10-05 21:36:30

标签: grails gsp

我认为在grails标签中解析变量时我遇到了一些困难。

在我的代码库中,我有

def contentArea = {attrs, body ->           
  def domainObject = Class.forName("${attrs.contentType}", true, Thread.currentThread().contextClassLoader).newInstance() 
  def numberOfRows = !StringUtils.equals("${attrs.max}", "null")? new Integer("${attrs.max}") : new Integer("1");
  def results = domainObject.getByContentAreaKey("${attrs.contentAreaKey}", numberOfRows)   
  out << g.render(
    template: '/layouts/contentTag',
    model: [contentAreaKey: attrs.contentAreaKey, results : results, contentNamespace: "${attrs.contentAreaKey}" + "_contentList", body:body()])
  out << body()
}
<_>在_contentTag.gsp中,布局为:

<b>In tag layout, </b>
<g:set var="${contentNamespace}" value="bobby"/>
contentNamespace = ${contentNamespace}<br/><!-- prints "minicontent_contentList" -->
minicontent_contentList = ${minicontent_contentList}<br/> <!-- prints "bobby" -->

在调用gsp中,标记被称为:

<mynamespace:contentArea var="myVar" contentAreaKey="minicontent" contentType="com.my.test.MiniContentType">
  <br/>Test Text<br/>
  <b>in calling GSP,</b> 
  contentNamespace = ${contentNamespace}<br/><!-- prints nothing -->
  minicontent_contentList = ${minicontent_contentList}<br/><!-- prints nothing -->          
</mynamespace:contentArea>

contentNamespace和minicontent_contentList未在标记正文中解析。是否有可能解决变量?如果是这样,我该怎么做?

如果它有助于答案,我有一个页面,其中包含许多小内容区域,我希望能够通过不同的控制器进行管理。内容区域背后都有类似的数据(文本,链接,图形等),但布局会有所不同。我使用了sitemesh布局来阻止页面,而调用gsp表示其中一个sitemesh内容块。

我对Grails很新,并且对SO求助,所以我非常愿意接受批评,但请保持温和。 :)

1 个答案:

答案 0 :(得分:1)

参数中传递的bodyClosure,它将其方法和参数解析为声明它的位置,这里将是主要的gsp。您可以尝试将delegate的{​​{1}}设置为代码库,并将body设置为resolveStrategy。这可以让您解决Closure.DELEGATE_FIRST

contentNamespace

要解决def contentArea = {attrs, body -> ... def contentNamespace = "${attrs.contentAreaKey}" + "_contentList" out << g.render( ... body.delegate = this body.resolveStrategy = Closure.DELEGATE_FIRST out << body() } 会更难,因为我不确定如何将模板指定为委托。您可以尝试在标记库中定义变量并将其传递给模板模型,然后将minicontent_contentlist值分配给该传递的对象,这可能会更新{{1的标记库代码中的值假设它是通过引用传递的同一个对象。

minicontent_contentlist

作为最终选项,您可以尝试在模板中分配resolveStrategy内部gsp curlies(def contentArea = {attrs, body -> ... def minicontent_contentList out << g.render( ..., model:[minicontent_contentList:minicontent_contentList]) ...delegate and resolveStrategy stuff... } <b>In tag layout, </b> <g:set var="minicontent_contentlist" value="bobby"/> contentNamespace = ${contentNamespace}<br/><!-- prints "minicontent_contentList" --> minicontent_contentList = ${minicontent_contentList}<br/> <!-- prints "bobby" --> ),以查看是否将模板对象分配给delegate/resolveStrategy参数。