2

<mk:pageViewTag>最初にテンプレートをレンダリングし.gsp、その本体を内部で実行するというカスタムタグがあります。

タグライブラリ( UtilTagLib.groovy ):

string namespace = "mk"

def pageViewTag = { attrs, body ->
    out << render(template: '/templates/pageTagView') {
        body()
    }
}
...

レンダリングするテンプレート ( templates/_pageTagView.gsp ):

<body>
    ${ body() }
    ...
</body>

GSP ( test.gsp )でカスタム タグを使用します。

<mk:pageViewTag>
    <g:set name="test" value="${1}">
    ${test?:0} %{--Here, I got 0. Variable test does not exist!--}%
</mk:pageViewTag>

<g:set>期待どおりに機能しないタグを除いて、すべてが完全に機能します。Grails は、私が宣言した変数を認識できません。

上記の例では、 variable を宣言testし、 integer で初期化しました1。出力として得0た .

Grails Docsによるとscope、属性を使用でき、に設定すると問題が解決しrequestます。

それ以外に修正できる方法はありますか?なぜこれが起こるのですか?

注意: の内部mk:pageViewTagは非常に大きいため、変数を外部で宣言することはできません。

4

4 に答える 4

1

完璧ではありませんが、トリックを必要としない迅速なソリューションです(まあ、ほとんど)。
最初に実行bodyしてから、テンプレート本体として含めます。

Taglib(UtilTagLib.groovy):

string namespace = "mk"

def pageViewTag = { attrs, body ->

    // Render body ahead!
    String renderedBody = body()

    out << render(template: '/templates/pageTagView') {
        renderedBody
    }
}
...
于 2012-10-10T17:33:05.597 に答える
1

g:set には、名前ではなく var 属性が必要です: http://grails.org/doc/2.2.1/ref/Tags/set.html

于 2014-09-02T00:22:16.567 に答える
0
string namespace = "mk"

def pageViewTag = { attrs, body ->
  out << render(template: '/templates/pageTagView', model:[body: body()])
}

templates/_pageTagView.gsp :

<body>
  ${body}
  ...
</body>
于 2012-10-10T20:20:53.000 に答える
0

テンプレート内で grails 変数を宣言し、それを親 gsp ファイル (テンプレートが含まれる場所) で使用しました。

例: Parent.gsp には、" <g:set var="a" value="${1}" />" を持つテンプレート _child.gsp が含まれています。Parent.gsp で変数「a」を出力すると、「null」がレンダリングされます。

したがって、変数を使用してテンプレートを挿入したり、テンプレートのレンダリング中に変数を設定したりしても機能しないことがわかりました。テンプレートのレンダリングには時間がかかり、親ページと非同期であるため、レンダリングが完了するまで変数の初期化を確認できません。

スコープが「リクエスト」に設定されている場合、この変数はリクエストサイクル全体で表示され、さらなるプロセスまたはアクセスのためにリクエストに保存されます。<g:set var="a" value="${1}" scope='request'/>またはを使用する<g:set var="a" value="${1}" scope='session'/>ことをお勧めします。

スコープの使用方法については、次のリンクを参照してください。

grails スコープの質問 - ページ、リクエスト、フラッシュ

grails <g:set> タグ セッション スコープの使用方法は?

于 2016-01-22T13:04:35.710 に答える