2014-11-23 11 views
7

Mam szablon, gdzie dla czterech elementów li powinienem mieć jeden element ul. Jak mam to zrobić? Teraz mam coś takiego:Jak iterować dla X elementów w Thymeleaf?

<div th:each="excursion,iterStat : ${excursions}"> 
    <ul th:if="${iterStat.index}/4 == 0"> 
     <li> 
      <a th:href="@{/excursion/{id}(id=${excursion.excursionId})}"><img src="/template/images/garden1.jpg" alt="Image" /></a> 
      <h2 th:text="${excursion.title}"></h2> 
      <p th:text="${#strings.abbreviate(excursion.description,128)}"></p> 
     </li> 
    </ul> 
</div> 

Myślałem if warunek zostanie zastosowany do elvery ul elementu, ale to wszystko, co ukrywać, w tym li elementu.

+0

Więc chcesz zupełnie nową listę nieuporządkowaną dla każdego elementu, a nie tylko nowego wiersza w liście? – Aeseir

+0

Potrzebuję listy z czterema elementami. Jednym ze sposobów osiągnięcia tego jest tworzenie list na każde cztery elementy. Ale mam nadzieję, że jest sposób, aby zrobić to, co chcę, z tylko jedną listą. – Dracontis

+0

Jeśli potrzebujesz listy z 4 elementami, w jakim celu: if = "$ {iterStat.index}/4 == 0" wyświetlasz? to nigdy nie zadziała, chyba że indeks = 0. Jeśli chcesz mieć listę z 4 elementami, to po prostu iteruj 4 razy. Dodam odpowiedź dla ciebie. – Aeseir

Odpowiedz

9

Zgodnie z Twoimi komentarzami, potrzebna Ci lista zawierająca 4 przedmioty, poniższe rozwiązanie wystarczy. Daj mi znać, jeśli masz problemy

<ul> 
<div th:each="excursion,iterStat : ${excursions}" th:if="${iterStat.index}<5">  
     <li> 
      <a th:href="@{/excursion/{id}(id=${excursion.excursionId})}"><img src="/template/images/garden1.jpg" alt="Image" /></a> 
      <h2 th:text="${excursion.title}"></h2> 
      <p th:text="${#strings.abbreviate(excursion.description,128)}"></p> 
     </li>  
</div> 
</ul> 

EDIT 1: Dalsza ocena na podstawie dostarczonych danych plonów inną możliwość. Wykorzystanie Mapa zamiast masowych wykazy w kontrolerze zanim zdasz go:

Map<String, List<Excursion>> excursionsList; 

Upewnij się ograniczyć każdą wycieczkę do 4 (jak wymagają). Następnie w Thymeleaf iteruj mapę.

<div th:each="excursion,rowStat : *{excursionsList}"> 
<ul> 
<div th:each="list,iterStat : *{excursion[__${rowStat.index}__].value}"> 
//your code for each list item information such as excursionId, description etc. 
</div> 
</ul> 
</div> 

To powinno oczyścić stosy kodów i zrobić to, jak tego potrzebujesz.

+0

Mam więcej niż 4 wycieczki (na przykład 5 lub 10) i chcę podzielić tę listę na listy ul z 4 elementami. wyświetlaj tylko pierwsze 4 rekordy: – Dracontis

+0

OK, myślę, że musisz przepisać swoje pytanie, aby wyjaśnić, co dokładnie po, jest bardzo trudne do jasnego zrozumienia.Myślę, że chcesz wdrożyć jakiś rodzaj modułu tak, że co 4 iteracji ty utworzyć nową listę? Czy to prawda? – Aeseir

+0

Wysłałem moją odpowiedź.Jeśli mógłbyś przepisać ją przy użyciu tylko jednej listy, wybieram twoją odpowiedź – Dracontis

1

Co zrobiłem, aby osiągnąć to, czego chcę. Kontroler:

@RequestMapping("/") 
public String index(Model model) 
{ 
    List<Excursion> excursions = excursionDao.findAll(); 
    List<List<Excursion>> excursionsLists = new LinkedList<List<Excursion>>(); 
    List<Excursion> tempList = new LinkedList<Excursion>(); 

    int listSize = excursions.size(); 
    for (int i = 0; i < listSize; i++) 
    { 
     tempList.add(excursions.get(i)); 
     if (listSize == (i+1) || tempList.size() == 4) 
     { 
      excursionsLists.add(tempList); 
      tempList = new LinkedList<Excursion>(); 
     } 
    } 

    model.addAttribute("excursionsLists", excursionsLists); 
    return "index"; 
} 

I thymeleaf szablon:

  <ul th:each="excursionsList : ${excursionsLists}"> 
       <li th:each="excursion : ${excursionsList}"> 
        <a th:href="@{/excursion/{id}(id=${excursion.excursionId})}"><img src="/template/images/garden1.jpg" alt="Image" /></a> 
        <h2 th:text="${excursion.title}"></h2> 
        <p th:text="${#strings.abbreviate(excursion.description,128)}"></p> 
       </li> 
      </ul>