我有一个名为<mk:pageViewTag>
的自定义标记,它首先呈现.gsp
模板,然后在其中执行其正文:
Taglib( UtilTagLib.groovy ):
string namespace = "mk"
def pageViewTag = { attrs, body ->
out << render(template: '/templates/pageTagView') {
body()
}
}
...
我渲染的模板( templates / _pageTagView.gsp ):
<body>
${ body() }
...
</body>
GSP我在( test.gsp )上使用自定义标记:
<mk:pageViewTag>
<g:set name="test" value="${1}">
${test?:0} %{--Here, I got 0. Variable test does not exist!--}%
</mk:pageViewTag>
除<g:set>
标记外,其他所有内容都能正常运行,而test
标记的效果并不像我预期的那样。 Grails根本无法看到我声明的变量。
在上面的例子中,我声明了变量1
并用整数0
初始化它。作为输出,我得到了scope
。
根据Grails Docs,我可以使用request
属性,并在设置为mk:pageViewTag
时解决问题。
我有什么方法可以解决它吗?为什么会这样?
注意:{{1}}的内部很大,所以我不能在外面的任何地方声明变量。
答案 0 :(得分:1)
不完美,但快速解决方案不需要技巧(好吧,几乎)
我首先执行body
然后将其包含为模板正文。
Taglib(UtilTagLib.groovy):
string namespace = "mk"
def pageViewTag = { attrs, body ->
// Render body ahead!
String renderedBody = body()
out << render(template: '/templates/pageTagView') {
renderedBody
}
}
...
答案 1 :(得分:1)
g:set需要var属性而不是名称:http://grails.org/doc/2.2.1/ref/Tags/set.html
答案 2 :(得分:0)
string namespace = "mk"
def pageViewTag = { attrs, body ->
out << render(template: '/templates/pageTagView', model:[body: body()])
}
templates / _pageTagView.gsp:
<body>
${body}
...
</body>
答案 3 :(得分:0)
我在模板中声明了一个grails变量,并在父gsp文件中使用它(包含模板)。
例如:Parent.gsp包含模板:_child.gsp,其中包含&#34; <g:set var="a" value="${1}" />
&#34;。打印变量&#39; a&#39;在Parent.gsp中呈现&#34; null&#34;。
因此我们发现,在渲染模板时插入带变量或设置变量的模板并不起作用。因为渲染模板需要时间并且与父页面异步。在渲染完成之前,我们无法确定变量初始化。
如果范围设置为&#34;请求&#34;,那么我们说这个变量应该在整个请求周期中可见,并且它们存储在请求中以便进一步处理或访问。
建议使用<g:set var="a" value="${1}" scope='request'/>
或<g:set var="a" value="${1}" scope='session'/>
。
请参阅以下链接,了解如何使用范围: