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。您可以尝试将body
的delegate
设置为标签库,并将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 3.0.2 无法解析控制器中的@Secured 注释