1

我有一个layout.gsp我为可能显示在任何页面上(或可能不显示)的控件(例如横幅)定义一些标记的地方。

<g:set var="showBanner" value="${...}" scope="page|request|flash|session"/>
<!-- Some more logic that may g:set showBanner var -->

<g:layoutBody/>

<g:if test="${[flash|request|???].showBanner}">
   <div id="banner">...</div>
</g:if>

这个想法是让由 呈现的页面<g:layoutBody>决定是否需要横幅。因此,一页可能决定始终显示横幅,如下所示 -page1.gsp:

<g:set var="showBanner" value="${true}" scope="page|request|flash|session"/>

另一个页面决定永远不会在其上显示横幅,如下所示 -page2.gsp:

<g:set var="showBanner" value="${false}" scope="page|request|flash|session"/>

不幸的是,这种方法对我不起作用。我尝试了所有不同的scope属性组合,但仍然无法在子页面中覆盖它。

这是一般的错误方法还是我错过了一些细节?

4

2 回答 2

3

我发现我做错了什么。问题是在包含页面内设置的变量是在代码运行之前评估的layout.gsp而不是在<g:layoutBody/>标签插入(或调用)的时刻。

换句话说,依赖关系是在布局之前呈现的,而不是在遇到布局指令的那一刻。这对某些人来说可能是直观的,但对其他人来说不是(对我来说不是)。

另一点是您仍然需要使用request范围来访问页面之间的相同 var(这非常直观)。

因此,解决方案变为:

首先在page1.gsp

<g:set var="showBanner" value="${true}" scope="request"/>

然后在layout.gsp

<!-- Doesn't matter were you put it, always evaluated first -->
<g:layoutBody/>

<g:if test="request.showBanner == null"> <!-- if not set by children page -->
    <g:set var="showBanner" value="${...}" scope="request"/>
    <!-- Some more logic that may g:set request.showBanner var -->
</g:if>

<g:if test="${request.showBanner}">
   <div id="banner">...</div>
</g:if>
于 2013-06-27T14:02:41.880 回答
0

你在拦截器中设置变量怎么样?就像这里显示的:从 Grails 中的布局视图访问模型

于 2013-06-27T15:07:21.070 回答