Получение индекса текущего цикла в Play! 2 Скала шаблон
В игре! 1, можно было получить текущий индекс внутри цикла с помощью следующего кода:
#{list items:myItems, as: 'item'}
<li>Item ${item_index} is ${item}</li>
#{/list}
Есть ли в Play2 эквивалент, чтобы сделать что-то подобное?
@for(item <- myItems) {
<li>Item ??? is @item</li>
}
Тот же вопрос для _isLast
а также _isFirst
,
PS: этот вопрос очень похож, но решение подразумевает изменение кода, чтобы вернуть Tuple (item, index)
вместо просто списка item
,
2 ответа
Да, zipWithIndex
К счастью, есть более элегантный способ его использования:
@for((item, index) <- myItems.zipWithIndex) {
<li>Item @index is @item</li>
}
Индекс основан на 0, поэтому, если вы хотите начать с 1 вместо 0, просто добавьте 1 к текущему отображаемому индексу:
<li>Item @{index+1} is @item</li>
PS: Отвечая на другой ваш вопрос - нет, нет неявного indexes
, _isFirst
, _isLast
свойства, в любом случае вы можете написать простые условия Scala внутри цикла, основываясь на значениях индекса zip (Int
) а также size
из списка (Int
также).
@for((item, index) <- myItems.zipWithIndex) {
<div style="margin-bottom:20px;">
Item @{index+1} is @item <br>
@if(index == 0) { First element }
@if(index == myItems.size-1) { Last element }
@if(index % 2 == 0) { ODD } else { EVEN }
</div>
}
Ответ в связанном вопросе в основном то, что вы хотите сделать. zipWithIndex
преобразует ваш список (который является Seq[T]
) в Seq[(T, Int)]
:
@list.zipWithIndex.foreach{case (item, index) =>
<li>Item @index is @item</li>
}