2

<g:each> から抜け出す方法はありますか? リストを繰り返し処理しているページがあり、それが DB に格納されている値である場合は、チェックボックスがオンになっていることを確認する必要があります。

もう少し明確にするために、次のようなものを検討してください。

<g:each in=${list1}>
    <g:each in=${list2}>
        <g:if test="${list1.id == list2.id}">
            <input type="checkbox" ... checked="checked" />
        </if>
    </g:each>
    ...
</g:each>

ここで、list1 は Domain1.list() (つまり、可能なすべての値) であり、list2 は Domain2.find(...) (つまり、選択された値) です。

g:each では、list1 のすべて (したがって、内部の each の後の "...") をチェックボックスで表示する必要がありますが、list2 (DB に保存されたユーザーが選択した項目) にあることを確認する必要があります。 ) に応じてチェックする必要があります (if ステートメント)。

ここで、最初の繰り返しでチェック済みステータスが変更された場合、それぞれ内部から抜け出す必要があります...これを行う方法はありますか?

ありがとう!

4

4 に答える 4

5

いいえ、各句ではありません。

list1 と list2 を受け取り、反復処理を行う独自の taglib を作成して、

<g:eachCheckedItem list1="${list1}" list2="${list2}">
    <input type="checkbox" ... checked="checked"/>
</g:eachCheckedItem>

そしてあなたのtaglibクラスで:

def eachCheckedItem = { attrs, body ->
    def list1 = attrs.list1
    def list2 = attrs.list2

    list1.findAll { list2.contains(it) }.each {
        out << body(listItem: it)  // access to listItem variable inside gsp
    }

}

そのようなもの(特定の問題に合わせて調整されたもの)は簡単に作成でき、gspファイルもかなりクリーンアップされます。この種のカスタム イテレータは、taglibs で常に使用しています。

于 2010-07-13T04:04:38.047 に答える
1

モデルでこれを行う必要があるため、ビューには単純なループしかありません。次に、コントローラーにDomain.findMyList()などを呼び出させるだけです。

于 2010-07-14T08:37:34.713 に答える
1

私があなたを正しく理解していれば、次のようなものが必要です。

<g:each var="elem1" in="${list1}">
   <g:if test="${list2.any{it.id==elem1.id}}">
     <input type="checkbox" checked="checked" />
   </g:if>
   ...
</g:each>

g:any タグはありませんが、Ted が指摘したように、簡単に作成できます (読者の課題として残しておきます)。次に、内側のタグを次のように単純化できます。

<g:any test="${it.id==elem1.id}" in="${list2}">...</g:any>
于 2010-07-13T08:05:17.340 に答える
0

元の投稿者の質問に対する答えを探しているグーグラーにとって、gsp にはブレーク コマンドがありません。ここにはより良い回答がいくつかありますが、私の意見では、.findAll { .. } を試して利用し、「休憩」の前に作業する予定のセットだけを見つけるのが最善の方法です。

http://markmail.org/message/tt2einl3ntwgzdep#query:grails%20gsp%20break%20out%20of%20loop+page:1+mid:nzhgwdsgkrwkurt4+state:results

于 2011-10-03T18:18:44.480 に答える