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 または Web プログラマーの場合:

  • 繰り返し値の可変カウントでフォームを作成する別の方法はありますか?
  • この大量のアイテムを 0 カウントで送信しないようにするにはどうすればよいですか?
4

1 に答える 1

1

私はPlayの経験がないので、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 に答える