2013-06-27 22 views
1

我有一個layout.gsp,我在其中定義了可能在任何頁面(或可能不顯示)上顯示的控件(比如標題)的標記。替代Grails <g:set>變量的值在<g:layoutBody>

<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屬性的所有不同組合,並且仍然無法在子頁面中重寫它。

這是一個錯誤的方法,或者我錯過了一些細節?

回答

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>