Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖Grails<;g:set>;变量';a<;g:layoutBody>;_Grails_Gsp - Fatal编程技术网

覆盖Grails<;g:set>;变量';a<;g:layoutBody>;

覆盖Grails<;g:set>;变量';a<;g:layoutBody>;,grails,gsp,Grails,Gsp,我有一个layout.gsp,其中我为一个控件(比如横幅)定义了一些标记,该控件可能显示在任何页面上(也可能不显示) 另一个页面决定不再在其上显示横幅,如下-page2.gsp: <g:set var="showBanner" value="${true}" scope="page|request|flash|session"/> <g:set var="showBanner" value="${false}" scope="page|request|flash|sessio

我有一个
layout.gsp
,其中我为一个控件(比如横幅)定义了一些标记,该控件可能显示在任何页面上(也可能不显示)

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

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

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


这是一个总体上错误的方法还是我遗漏了一些细节?

我发现了我做错的地方。问题是在
布局.gsp
代码运行之前,而不是在
标记插入(或调用)时,对包含页面中设置的变量进行评估

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

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

因此,解决方案变成:

gsp第1页中的第一个:

<g:set var="showBanner" value="${true}" scope="request"/>
<!-- 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>

在拦截器中设置变量怎么样?如图所示:

<!-- 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>