Grails <g:set>标签未在自定义标签内执行</g:set>

时间:2012-10-10 16:24:49

标签: grails taglib

我有一个名为<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}}的内部很大,所以我不能在外面的任何地方声明变量。

4 个答案:

答案 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'/>

请参阅以下链接,了解如何使用范围:

grails scope questions - page, request, flash

How to use grails <g:set> tag session scope?