0

我正在尝试使用 Play 2 和 Scala 制作订单。

这是分组前的样子:

<table>
  @items.zipWithIndex.map {
    case (item, index) =>
      @itemRow(item, index)
  }
</table>

itemRow 定义

@itemRow(index: Int, item: Item) = {
    <tr>
        <td>
        @(index+1)
        </td>
        <td>
        @item.name
        </td>
        <td>
            <input type="hidden" name="@requestForm("items")("[" + index + "]")("itemId").name" value="@item.id">
            <input type="text" name="items[@index].count" value="@requestForm("items")("[" + index + "]")("count").value">

        </td>
    </tr>
}

起初我尝试了幼稚的实现

@items.groupBy(item => item.category).map {
  case (categoryId, itemsInCategory) =>
    <table>
      @itemsInCategory.zipWithIndex.map {
        case (item, index) =>
          @itemRow(item, index)
      }
    </table>
}

但是有一个问题,每个类别的索引都是从 0 开始的。

所以,http请求是这样的:

# category 1
items[0].id = 1
items[0].count = 1
items[1].id = 2
items[1].count = 2

# category 2
items[0].id = 3
items[0].count = 1
items[1].id = 4
items[1].count = 5

它是导致值被覆盖的原因。我需要我的索引在表单中是连续的,如下所示:

# category 1
items[0].id = 1
items[0].count = 1
items[1].id = 2
items[1].count = 2

# category 2
items[2].id = 3
items[2].count = 1
items[3].id = 4
items[3].count = 5

所以有问题

对于函数式程序员:

  • 我可以为所有组共享索引变量吗?

对于 Play 2.0 或网络程序员:

  • 有没有另一种方法来制作具有可变重复值计数的表格?
  • 如何避免发送这一堆计数为 0 的物品?
4

1 回答 1

1

我没有玩游戏的经验,所以我无法评论 Play 的具体问题(也许它已经为你想要的东西提供了帮助),但仅在 scala librayr 上你可以做这样的事情:

@items.sortBy(item => item.category).zipWithIndex.groupBy{ case (item, _) => item.category}.map {
  case (categoryId, indexedItemsInCategory) =>
    <table>
      @indexedItemsInCategory.map {
        case (item, index) =>
          @itemRow(item, index)
      }
    </table>
}

这个想法是首先按类别对项目进行排序,然后将它们与相应的索引一起压缩。然后只有你按类别对它们进行分组(这应该很快,因为列表已经排序)。

于 2013-01-17T13:33:02.113 回答