Grails / GSP: вырваться из <g: каждый> - PullRequest
2 голосов
/ 13 июля 2010

Есть ли способ вырваться из ? У меня есть страница, на которой я перебираю список, и я должен убедиться, что флажок установлен, если это было значение, хранящееся в БД.

Чтобы было немного понятнее, рассмотрите что-то вроде:

<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 (следовательно, «...» после внутреннего каждого) с флажком, но мне нужно убедиться, что те в list2 (выбранные пользователем элементы, которые были сохранены в БД) должны быть проверены соответственно (если выписка).

Теперь, если проверенный статус был изменен на первой итерации, мне нужно выбраться изнутри каждой ... любой способ сделать это?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 13 июля 2010

Нет, не с каждым предложением.

Я бы просто написал свой собственный taglib, который принимает list1 и list2 и выполняет итерацию за вас, возвращаясь к

<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-файл.Я использую эти виды пользовательских итераторов все время в своих тегах.

1 голос
/ 14 июля 2010

Вы должны сделать это в модели, чтобы у вас был только простой цикл в представлении.Тогда нужно просто заставить контроллер вызвать Domain.findMyList () или что-то еще.

1 голос
/ 13 июля 2010

Если я вас правильно понял, вам нужно что-то вроде этого:

<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, но, как указал Тед, его легко написать (оставьте в качестве упражнениячитателю).Тогда вы можете упростить внутренний тег до чего-то вроде этого:

<g:any test="${it.id==elem1.id}" in="${list2}">...</g:any>
0 голосов
/ 03 октября 2011

Для googlers, которые ищут ответ на вопрос оригинального автора, в gsp нет команды break.Здесь есть несколько лучших ответов, лучший из которых, на мой взгляд, состоит в том, чтобы попытаться использовать .findAll {..}, чтобы найти только набор, над которым вы ожидаете поработать до «перерыва».

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

...