Подтвердить что ты не робот

Получение индекса текущего цикла в Play! 2 Scala шаблон

В игре! 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.

4b9b3361

Ответ 1

Да, 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 внутри цикла, основываясь на на значения zipped index (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>
}

Ответ 2

Ответ в связанном вопросе - это в основном то, что вы хотите сделать. zipWithIndex преобразует ваш список (который является Seq[T]) в Seq[(T, Int)]:

@list.zipWithIndex.foreach{case (item, index) =>
  <li>Item @index is @item</li>
}