2010-07-13 10 views
2

Y a-t-il un moyen de sortir d'un < g: chacun>? J'ai une page dans laquelle je parcours une liste et je dois m'assurer qu'une case à cocher est cochée si c'est la valeur stockée dans DB.Grails/GSP: sortir de <g:each>

Pour le rendre un peu plus clair, s'il vous plaît envisager quelque chose comme:

<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> 

où list1 est, par exemple Domain1.list() (c.-à toutes les valeurs possibles) et liste2 est Domain2.find (...) (c'est-à-dire les valeurs SÉLECTIONNÉES)

Dans le g: chacun, j'ai besoin d'afficher TOUT de list1 (d'où le "..." après le interne chacun) avec une case à cocher mais je dois m'assurer que ceux de list2 (les éléments sélectionnés par l'utilisateur qui ont été enregistrés dans DB) doivent être vérifiés en conséquence (if statement).

Maintenant, si le statut vérifié a été changé lors de la première itération, je dois sortir de l'intérieur chaque ... façon de le faire?

Merci!

Répondre

5

Non, pas avec chaque clause.

je venais d'écrire mon propre taglib qui prend list1 et list2 et fait l'itération pour vous, ce qui donne de retour à la

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

Et dans votre classe 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 
    } 

} 

Quelque chose comme cela (réglé sur votre problème spécifique) est facile à écrire, et nettoie également votre fichier gsp un peu. J'utilise ces types d'itérateurs personnalisés tout le temps dans mes taglibs.

+0

ah, ok ... Je vais regarder dans ce plus. Merci!! – callie16

1

Si je vous ai bien compris, vous avez besoin de quelque chose comme ceci:

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

Il n'y a pas g: une étiquette, mais comme Ted a fait remarquer, il serait facile d'écrire un (à titre d'exercice à le lecteur). Ensuite, vous pouvez simplifier la l'étiquette intérieure à quelque chose comme ceci:

<g:any test="${it.id==elem1.id}" in="${list2}">...</g:any> 
1

Vous devriez le faire dans le modèle, vous avez alors seulement une simple boucle dans la vue. Ensuite, il suffit de faire en sorte que le contrôleur appelle Domain.findMyList() ou autre.