Grails 标记不解析其主体中的变量

Posted

技术标签:

【中文标题】Grails 标记不解析其主体中的变量【英文标题】:Grails Tag Not Resolving Variables in Its Body 【发布时间】:2011-12-01 20:30:32 【问题描述】:

我认为在 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】:

body,作为传入的参数,是一个Closure,它将把它的方法和参数解析到它被声明的位置,这里将是主要的gsp。您可以尝试将bodydelegate 设置为标签库,并将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 会更难,因为我不确定如何将模板指定为委托。您可以尝试在标签库中定义变量并将其传递给模板模型,然后将minicontent_contentlist 值分配给该传递的对象,这可能会更新标签库代码中的值以使resolveStrategy 工作,假设它是通过引用传递的同一个对象。

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" -->

作为最后一个选项,您可以尝试在模板中分配 gsp 卷曲 ($) 内的 delegate/resolveStrategy,以查看是否将模板对象分配给 delegate 参数。

【讨论】:

非常感谢您的回答,我一直在尝试您的第一个建议的变体,但我无法在调用 gsp 中获取 contentNamespace。您确实指导我对代表进行了更多调查,所以希望我能很快取得突破。

以上是关于Grails 标记不解析其主体中的变量的主要内容,如果未能解决你的问题,请参考以下文章

Grails 4:不读取 Elastic Beanstalk 中的环境变量

Grails 控制器变量在视图中不可见

Grails 3.0.2 无法解析控制器中的@Secured 注释

从 json 文件中解析 grails 中的日期

grails - org.hibernate.QueryException(无法解析属性)

Grails sitemesh 是不是有任何解决方法不支持带有开放 HTML 正文标记的 if 语句