覆盖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>