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>、バナーを表示するかどうかを決定させることです。したがって、次のように、1 つのページで常にバナーを表示することを決定できます。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もう 1 つのポイントは、スコープを使用してページ間で同じ 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 に答える