2

g:include を使用して、特定のページの本文コンテンツのみを含めることができるかどうか疑問に思っています。

次のようなメイン レイアウト ページがあるとします。

<html>
  <head>
    <title>My start page</title>
    <g:layoutHead>
  </head>
  <body>
    <g:layoutBody>
  </body>
</html>

次に、メイン ページ (index.gsp)

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE
    <g:include controller="book" action="list"/>
    <g:link controller="book" action="list">See the full list!</g:link>
  </body>
</html>

そして最後に本/リストページ

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    <table>
    <g:each in="${books}">
      <tr>
        <td>${it.author}</td>
        <td>${it.title}</td>
        <td>${it.price}</td>
      </tr>
    </g:each>
    </table>
  </body>
</html>

だから私が達成したいのは、メイン ページ (index.gsp) にはブック/リスト ページで定義されたテーブルのみが含まれることです。ただし、これを試すと、定義されたhtml全体(<html>タグとすべて)が含まれます。

どういうわけかこれを行うことは可能ですか?私は次のようなことを試しましたが<g:include controller="book" action="list" view="someView.gsp"/>、これはうまくいきません。既存のコントローラーを再利用したい「インデックスコントローラー」にブックリストロジックを追加する必要を本当に避けたいです。

このユースケースを持っているのは私が最初ではありません。

4

3 に答える 3

6

タグを使用できますapplyLayoutempty.gsp以下のみを使用してレイアウトを作成するだけです。

<g:layoutBody/>

include次に、タグをapplyLayout次のように飾ります。

<g:applyLayout name="empty">
  <g:include controller="book" action="list"/>
</g:applyLayout>

詳細については、 Grails ガイドのエントリを参照してください。

于 2011-06-14T16:58:40.920 に答える
0

これは私見では直接不可能です。g:includeたとえば、xpath 式によってコードの一部を削除するカスタム タグを に基づいて作成するというアイデアがあります。これがすでにどこかに存在していることに気づいていません。

別の方法は、本の本文部分をテンプレートにリファクタリングし、そのlist.gspテンプレートを使用して参照することです。ただし、これは、g:render がコントローラーを呼び出さないため、データ モデルが index.gsp コンテキストで使用可能でなければならないことを意味します。index.gspg:render

補足: 使用する場合は、ページ フラグメントのキャッシュにspringcache プラグインg:includeを使用することをお勧めします。

于 2011-06-14T08:47:05.297 に答える
-1

はい。ただし、そこにもう1つのレベルが必要です。Grailsテンプレートを見てください。基本的に、次のテンプレートがあります。_books.gspには、次のものが含まれます。

   <table>
    <g:each in="${books}">
      <tr>
        <td>${it.author}</td>
        <td>${it.title}</td>
        <td>${it.price}</td>
      </tr>
    </g:each>
    </table>

次に、インデックスは次のようになります。

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE
    <g:render template="books">
    <g:link controller="book" action="list">See the full list!</g:link>
  </body>
</html>

そしてあなたのリストは次のようになります:

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    <g:render template="books" />
  </body>
</html>

(これを行ってから数か月が経過しているため、私の構文は100%正しくない可能性がありますが、テンプレートの背後にある考え方は、単独で表示することを意図していない、短く再利用可能なGSPコードです。

于 2011-06-14T16:16:23.387 に答える