2

我有一个名为的自定义标签<mk:pageViewTag>,它首先呈现.gsp模板,然后在里面执行它的主体:

标签库(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>标签,它没有按我预期的那样运行。Grails 根本看不到我声明的变量。

在上面的示例中,我声明了变量test并使用 integer 对其进行了初始化1。作为我得到的输出0

根据Grails Docs我可以使用scope属性,当设置为request.

有什么方法可以解决它吗?为什么会发生这种情况?

注意:内部mk:pageViewTag很大,所以我不能在外面的任何地方声明一个变量。

4

4 回答 4

1

g:set 需要一个 var 属性而不是名称: http: //grails.org/doc/2.2.1/ref/Tags/set.html

于 2014-09-02T00:22:16.567 回答
1

不完美,但不需要技巧的快速解决方案(嗯,几乎)。
body先执行,然后将其作为模板正文包含在内。

标签库(UtilTagLib.groovy):

string namespace = "mk"

def pageViewTag = { attrs, body ->

    // Render body ahead!
    String renderedBody = body()

    out << render(template: '/templates/pageTagView') {
        renderedBody
    }
}
...
于 2012-10-10T17:33:05.597 回答
0
string namespace = "mk"

def pageViewTag = { attrs, body ->
  out << render(template: '/templates/pageTagView', model:[body: body()])
}

模板/_pageTagView.gsp :

<body>
  ${body}
  ...
</body>
于 2012-10-10T20:20:53.000 回答
0

我在模板中声明了一个 grails 变量,并在父 gsp 文件(包含模板的地方)中使用了它。

例如:Parent.gsp 包括模板:_child.gsp,其中有“ <g:set var="a" value="${1}" />”。在 Parent.gsp 中打印变量“a”会呈现“null”。

因此,我们发现在渲染模板时插入带有变量的模板或设置变量不起作用。因为渲染模板需要时间并且与父页面异步。在渲染完成之前,我们无法确定变量初始化。

如果范围设置为“请求”,那么我们说这个变量应该在整个请求周期中都是可见的,并且它们存储在请求中以供进一步处理或访问。建议使用<g:set var="a" value="${1}" scope='request'/><g:set var="a" value="${1}" scope='session'/>

请参阅这些有关如何使用范围的链接:

grails 范围问题 - 页面、请求、flash

如何使用 grails <g:set> 标签会话范围?

于 2016-01-22T13:04:35.710 回答