我认为在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求助,所以我非常愿意接受批评,但请保持温和。 :)
答案 0 :(得分:1)
参数中传递的body
是Closure
,它将其方法和参数解析为声明它的位置,这里将是主要的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
参数。